資料結構與演算法-氣泡排序
阿新 • • 發佈:2018-12-11
概覽
基本概念
氣泡排序(Bubble Sort)一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。
java程式碼實現
//申明待排序陣列
int[] a = {9,1,5,8,3,7,4,6,2};
for (int i = 0; i < a.length; i++) {
for (int j = a.length-1; j > i; j--) { /* 注意j是從後往前迴圈 */
if (a[j-1] > a[j]) { /* 若前者大於後者,交換之 */
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
圖示執行過程
進一步優化
-
如果我們待排序的序列是{2,1,3,4,5,6,7,8,9},也就是說,除了第一和第二的關鍵字需要交換外,別的都已經是正常的順序。當i=1時,交換了2和1,此時序列已經有序,但是演算法仍然不依不饒地將i=2到9以及每個迴圈中j迴圈都執行一遍,儘管並沒有交換資料,但是之後的大量比較還是大大地多餘了。
-
設定flag標記,及時退出迴圈
//申明待排序陣列
int[] a = {9,1,5,8,3,7,4,6,2};
boolean flag = true; /* flag用來作為標記 */
for (int i = 0; i < a.length && flag; i++) { /* 若flag為false則退出迴圈 */
flag = false; /* 初始為false */
for (int j = a.length-1; j > i; j--) {
if (a[j-1] > a[j]) {
int temp = a[j-1];
a[ j-1] = a[j];
a[j] = temp;
flag = true; /* 如果有資料交換,則flag為true */
}
}
}
時間複雜度分析
- 最好的情況,也就是待排序的表本身就是有序的,那麼根據優化後的程式碼可以推斷出就是n-1次比較,沒有資料交換,時間複雜度為O(n);
- 最壞的情況,也就是待排序表是逆序的,此時需要比較1+2+3+···+(n-1) = n(n-1)/2次,並作等數量級的記錄移動,時間複雜度為O(n2);
- 因此,總的時間複雜度為O(n2)。