冒泡排序基本思想:
冒泡排序是交换排序的一种,两两比较待排序的关键字,发现两个记录的次序相反时即进行交换。
在冒泡排序的过程中,关键字小的记录好比水中的气泡逐趟向上漂浮,而关键字大的记录好比石块往下沉,每一趟有一个最大的石头沉搭到水底。
排序过程:
首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即source[1].key>source[2].key),则交换两个记录。
以此类推,直到第n-1个记录和第n个记录的关键字进行比较,这个过程称作第一趟排序,其结果使得最大的记录被安置到最后一个记录的位置上。
冒泡排序效率:
若初始序列为“正序”,则只需要进行一趟排序,在排序过程中进行n-1次关键字的比较,且不移动记录;
若初始序列为“逆序”,则需要进行n-1趟排序,在排序过程中进行n(n-1)/2次关键字的比较,并做等数量级的记录移动。
因此,总的时间复杂度为O(n2), 最好时间复杂度为O(n)。
冒泡排序稳定性:
在待排序的文件中,若存在多个关键字相同的记录,经过排序后,这些具有相同关键字的记录之间的相对次序保持不变,则称该方法是稳定的。
冒泡排序时就地排序,因此他是稳定的。
JAVA实现的冒泡排序:
public class BubbleSort {
//bubbleSort 实现
public static void bubbleSort(int[] source) {
boolean flag = false; //设置交换标志
for(int i=source.length-1;i>0;i--) {
for(int j=0; j<i; j++) {
if (source[j] > source[j+1]) {
swap(source, j, j+1);
flag = true; //表示在这趟排序过程中进行了交换
}
if(!flag) { //本趟排序未进行交换,提前返回
return;
}
}
}
}
//交换函数swap
public static void swap(int[] source, int i, int j) {
int temp = source[i];
source[i] = source[j];
source[j] = temp;
}
//测试上面的bubbleSort方法
public static void main(String[] args) {
int test[] = {23,5,21,2,2,2,43,54,6,77};
bubbleSort(test);
for(int i=0; i<test.length;i++) {
System.out.println(test[i]);
}
}
}
输出结果:
2
2
2
5
6
21
23
43
54
77