冒泡排序基本思想:
冒泡排序是交換排序的一種,兩兩比較待排序的關鍵字,發現兩個記錄的次序相反時即進行交換。
在冒泡排序的過程中,關鍵字小的記錄好比水中的氣泡逐趟向上漂浮,而關鍵字大的記錄好比石塊往下沉,每一趟有一個最大的石頭沉搭到水底。
排序過程:
首先將第一個記錄的關鍵字和第二個記錄的關鍵字進行比較,若爲逆序(即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