【排序演算法】氣泡排序(Bubble Sort)
阿新 • • 發佈:2018-12-04
一、簡介
氣泡排序(Bubble Sort)也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
二、解題思路
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
三、程式碼實現
private static void bubbleSort(int[] arr) { for (int i = 1; i < arr.length; i++) { for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } System.out.println("第" + i + "步:" + Arrays.toString(arr)); } }
四、演算法升級
很明顯,冒泡演算法需要進行內外各迴圈一次,時間複雜度為O(n^2),對於部分有序的陣列而言,我們是可以進行進一步優化的,從而減少遍歷次數。當內迴圈遍歷之後,沒有進行過任何一次資料交換,那麼就認為當前排序已經結束了。程式碼如下:
private static void bubbleSortPlus(int[] arr) { for (int i = 1; i < arr.length; i++) { /** * 設定一個標記,若為true,則表示此次迴圈沒有進行交換,也就是待排序已經有序,排序已經完成 */ boolean flag = true; for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; flag = false; } } System.out.println("第" + i + "步:" + Arrays.toString(arr)); if (flag) { break; } } }