首页 > 编程知识 正文

冒泡排序c++代码(冒泡算法java写法)

时间:2023-05-04 02:04:51 阅读:68452 作者:1420

用java实现冒泡排序算法,用java冒泡算法

泡沫排序的算法分析与改进

排序的基本思想是比较待排序的记录的两个关键字,并且如果发现两个记录的顺序相反,则进行交换直到没有相反顺序的记录。

应用交换排序基本思想的主要排序方法是鼓泡排序和快速排序。

复制代码就是:

publicclassbubblesortimplementssortutil.sort {

公共语音软件(int [ ] data ) {

int temp;

for(intI=0; I

for(intj=data.Length-1; ji; j---- ) {

if(data[j]

sort util.swap (数据,j,j-1 );

}

}

}

}

泡沫排序

1、排序方法

将排序后的记录数组R[1.n]纵向排列,每个记录r视为重R.key的气泡。 基于轻气泡不能在重气泡下的原则,自下而上扫描序列r。 如果扫描到违反这个原则的轻气泡,就会“浮”在上面。 这样重复,直到最后任何气泡都是轻的在上,重的在下。

(1)初期

R[1.n]是无序区。

)2)首次扫描

从无序区底向上依次比较相邻两个气泡的重量,若发现轻者在下,重者在上,则交换两者的位置。 即,(R[n]、R[n-1]、) R[n-1]、R[n-2]、…、(R[2]、R[1]; 对于每一对气泡(R[j 1],R[j] ),R[j 1].key

第一次扫描结束后,“最轻”的气泡漂浮在该区间的最上面。 也就是说,关键字最小的记录被放置在最高的位置R[1]。

)3)第二次扫描

扫描R[2.n]。 扫描结束后,“次轻”的气泡飘到R[2]的位置……

最后,经过n-1次扫描能够得到规则区域R[1.n]

注意:第I次扫描时,R[1.i-1]和R[i.n]分别为当前有序区域和无序区域。 扫描从无序区域的底部向上进行。 扫描结束后,该区中最轻的气泡悬浮在顶部位置r,结果R[1.i]形成新秩序区。

2、冒泡排序流程实例

对关键字数组为49 38 65 97 76 13 27 49的文件进行气泡排序的过程

3、排序算法

)1)分析

由于各排列在规则区域各增加一个气泡,经过n-1排列后,规则区域存在n-1个气泡,无序区域气泡的重量始终在规则区域气泡的重量以上,因此整个鼓泡排列过程中最多需要进行n-1排列。

如果在某个周转中找不到气泡位置的交换,则排序对象的无序区域内的所有气泡都符合轻者上、重者下的原则,因此鼓泡排序过程可以在此周转中结束。 因此,以下算法引入了布尔exchange,使其在每个排序开始之前为FALSE。 如果在排序过程中发生交换,请将其设置为TRUE。 每个转弯结束时检查exchange,如果没有发生交换,则结束算法,不进行下一个转弯。

)2)具体算法

复制代码就是:

语音蓝牙(seqlistr )。

//R(L.N )是要排序的文件,从下向上扫描,通过鼓泡r进行排序

int i,j;

布尔交换; //交换标志

for(I=1; I

Exchange=假; //在这次排序开始之前,交换标志必须是假的

for(j=n-1; j=i; j----//自下而上扫描当前无序区域R[i.n]

if(r[j1].key

R[0]=R[j 1]; //R[0]仅登台单元,而不是哨兵

R[j 1]=R[j];

R[j]=R[0];

Exchange=真; //因为有交换,所以把交换标志设为真

}

if (! exchange这次的排序不发生交换,提前结束算法

返回;

} //endfor (外循环) ) )。

} //BubbleSort

4、算法分析

)1)算法的最高时间复杂度

如果文件的初始状态为正常,则一次扫描即可完成排序。 所需的关键字比较次数c和记录移动次数m均达到最小值。

Cmin=n-1

Mmin=0。

鼓泡排序的最佳时间复杂度是o(n )。

)2)算法最坏的时间复杂度

如果初始文件是逆序的,则必须对其进行n-1次排序。 每次排序都要进行n-i次关键字的比较(1in-1 ),每次比较都要移动3次记录到达交换记录位置。 在这种情况下,比较和移动的次数都达到最大值。

cmax=n(n-1 )/2=o (N2 )

max=3n(n-1 )/2=o ) (N2 ) )。

鼓泡排序最差的时间复杂度为o(n2 )。

)3)算法的平均时间很复杂

杂度为O(n2)

虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。

(4)算法稳定性

冒泡排序是就地排序,且它是稳定的。

5、算法改进

上述的冒泡排序还可做如下的改进:

(1)记住最后一次交换发生位置lastExchange的冒泡排序

在每趟扫描中,记住最后一次交换发生的位置lastExchange,(该位置之前的相邻记录均已有序)。下一趟排序开始时,R[1..lastExchange-1]是有序区,R[lastExchange..n]是无序区。这样,一趟排序可能使当前有序区扩充多个记录,从而减少排序的趟数。具体算法【参见习题】。

(2) 改变扫描方向的冒泡排序

①冒泡排序的不对称性

能一趟扫描完成排序的情况:

只有最轻的气泡位于R[n]的位置,其余的气泡均已排好序,那么也只需一趟扫描就可以完成排序。

【例】对初始关键字序列12,18,42,44,45,67,94,10就仅需一趟扫描。

需要n-1趟扫描完成排序情况:

当只有最重的气泡位于R[1]的位置,其余的气泡均已排好序时,则仍需做n-1趟扫描才能完成排序。

【例】对初始关键字序列:94,10,12,18,42,44,45,67就需七趟扫描。

②造成不对称性的原因

每趟扫描仅能使最重气泡"下沉"一个位置,因此使位于顶端的最重气泡下沉到底部时,需做n-1趟扫描。

③改进不对称性的方法

在排序过程中交替改变扫描方向,可改进不对称性。

JAVA代码:

复制代码 代码如下:

package Utils.Sort;

/**

*@author Linyco

*利用冒泡排序法对数组排序,数组中元素必须实现了Comparable接口。

*/

public class BubbleSort implements SortStrategy

{

/**

*对数组obj中的元素以冒泡排序算法进行排序

*/

public void sort(Comparable[] obj)

{

if (obj == null)

{

throw new NullPointerException("The argument can not be null!");

}

Comparable tmp;

for (int i = 0 ;i < obj.length ;i++ )

{

//切记,每次都要从第一个开始比。最后的不用再比。

for (int j = 0 ;j < obj.length - i - 1 ;j++ )

{

//对邻接的元素进行比较,如果后面的小,就交换

if (obj[j].compareTo(obj[j + 1]) > 0)

{

tmp = obj[j];

obj[j] = obj[j + 1];

obj[j + 1] = tmp;

}

}

}

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。