用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;
}
}
}
}
}