排序——氣泡排序
阿新 • • 發佈:2018-12-16
氣泡排序思想
將相鄰的元素兩兩進行比較,大的元素向後移動一位,第一輪迴圈比較後,最大的元素移到了最後位置,以此進行。(按升序來說)
- 排序穩定性:穩定
- 複雜度:O(n²)
實現版:
/** * 氣泡排序 * @param a 待排序陣列 * @param n 陣列長度 */ private void bubbleSort(int a[], int n) { int i, j, tmp; for (i = n - 1; i >= 0; i--) { for (j = 0; j < n - 1; j++) { if (a[j] > a[j + 1]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] =tmp; } } } }
優化版一:
* 設定一個標誌flag,預設為false * 如果每輪發生元素交換則置為true * 如果一輪比較沒有發生元素交換則說明元素已排好序,結束迴圈即可
/** * 氣泡排序優化版 * 設定一個標誌flag,預設為false * 如果每輪發生元素交換則置為true * 如果一輪比較沒有發生元素交換則說明元素已排好序,結束迴圈即可 * @param a * @param n */ private static void bubbleSort1(int a[], int n) { int i, j, tmp; boolean flag = false; for (i = n - 1; i >= 0; i--) { for (j = 0; j < n - 1; j++) { if (a[j] > a[j + 1]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] =tmp; flag = true; } } if (!flag){ break; } } }
優化版二:
某一輪結束位置為j,但是這一輪的最後一次交換髮生在lastSwap的位置,則lastSwap到j之間是排好序的,下一輪的結束點就不必是j--了,而直接到lastSwap即可
private static void bubbleSort2(int a[], int n) { int i, j, lastSwap, tmp; for (j=n-1; j>0; j=lastSwap) { lastSwap=0;//每一輪要初始化為0,防止某一輪未發生交換,lastSwap保留上一輪的值進入死迴圈 for (i=0; i<j; i++) { if (a[i] > a[i+1]) { tmp=a[i]; a[i]=a[i+1]; a[i+1]=tmp;//最後一次交換位置的座標 lastSwap = i; } } } }