經典排序算法 - 冒泡排序Bubble sort算法
原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,windows
這樣一趟過去後,最大或最小的數字被交換到了最後一位,數組
而後再從頭開始進行兩兩比較交換,直到倒數第二位時結束,其他相似看例子ide
例子爲從小到大排序,優化
原始待排序數組| 6 | 2 | 4 | 1 | 5 | 9 |spa
第一趟排序(外循環).net
第一次兩兩比較6 > 2交換(內循環)orm
交換前狀態| 6 | 2 | 4 | 1 | 5 | 9 |blog
交換後狀態| 2 | 6 | 4 | 1 | 5 | 9 |排序
第二次兩兩比較,6 > 4交換
交換前狀態| 2 | 6 | 4 | 1 | 5 | 9 |
交換後狀態| 2 | 4 | 6 | 1 | 5 | 9 |
第三次兩兩比較,6 > 1交換
交換前狀態| 2 | 4 | 6 | 1 | 5 | 9 |
交換後狀態| 2 | 4 | 1 | 6 | 5 | 9 |
第四次兩兩比較,6 > 5交換
交換前狀態| 2 | 4 | 1 | 6 | 5 | 9 |
交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |
第五次兩兩比較,6 < 9不交換
交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |
交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |
第二趟排序(外循環)
第一次兩兩比較2 < 4不交換
交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |
交換後狀態| 2 | 4 | 1 | 5 | 6 | 9 |
第二次兩兩比較,4 > 1交換
交換前狀態| 2 | 4 | 1 | 5 | 6 | 9 |
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |
第三次兩兩比較,4 < 5不交換
交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 |
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |
第四次兩兩比較,5 < 6不交換
交換前狀態| 2 | 1 | 4 | 5 | 6 | 9 |
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |
第三趟排序(外循環)
第一次兩兩比較2 > 1交換
交換後狀態| 2 | 1 | 4 | 5 | 6 | 9 |
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
第二次兩兩比較,2 < 4不交換
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
第三次兩兩比較,4 < 5不交換
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
交換後狀態| 1 | 2 | 4 | 5 | 6 | 9 |
第四趟排序(外循環)無交換
第五趟排序(外循環)無交換
排序完畢,輸出最終結果1 2 4 5 6 9
咱們把後邊想像成水面,前邊是水底,就是冒泡泡了。
代碼以下:
// 冒泡排序1 void BubbleSort1(int a[], int n) { int i, j; for (i = 0; i < n; i++) for (j = 1; j < n - i; j++) if (a[j - 1] > a[j]) Swap(a, j); } |
下面對其進行優化,設置一個標誌,若是這一趟發生了交換,則爲true,不然爲false。明顯若是有一趟沒有發生交換,說明排序已經完成。
void BubbleSort2(int a[], int n) { int j, k; boolean flag; k = n; flag = true; while (flag) {
flag = false; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a, j); flag = true; } k--; } }
|
再作進一步的優化。若是有100個數的數組,僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在第一趟遍歷後,最後發生交換的位置一定小於10,且這個位置以後的數據一定已經有序了,記錄下這位置,第二次只要從數組頭部遍歷到這個位置就能夠了。
// 冒泡排序3 void BubbleSort3(int a[], int n) { int j, k; int flag;
flag = n; while (flag > 0) { k = flag; flag = 0; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a, j); flag = j; } } } |
完整代碼以下:
publicclass SortTest {
publicstaticvoid main(String[] args) { int[] a = { 6, 2, 4, 1, 5, 9 }; new SortTest().BubbleSort3(a, a.length); } // 冒泡排序3 void BubbleSort3(int a[], int n) { int j, k; int flag;
flag = n; while (flag > 0) { k = flag; flag = 0; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a, j); flag = j; } } } // 冒泡排序2 void BubbleSort2(int a[], int n) { int j, k; boolean flag; k = n; flag = true; while (flag) {
flag = false; for (j = 1; j < k; j++) if (a[j - 1] > a[j]) { Swap(a, j); flag = true; } k--; } }
// 冒泡排序1 void BubbleSort1(int a[], int n) { int i, j; for (i = 0; i < n; i++) for (j = 1; j < n - i; j++) if (a[j - 1] > a[j]) Swap(a, j); }
privatevoid Swap(int[] a, int j) { int temp = a[j - 1]; a[j - 1] = a[j]; a[j] = temp;
for (int j2 = 0; j2 < a.length; j2++) { System.out.print(a[j2] + " "); } System.out.println();
} } |