1. 程式人生 > >【排序算法】冒泡排序(Bubble Sort)

【排序算法】冒泡排序(Bubble Sort)

就是 思路 bubble 進行 ref bool 除了 優化 private

一、簡介

冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

二、解題思路

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
  3. 針對所有的元素重復以上的步驟,除了最後一個。
  4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

三、代碼實現

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;
        }
    }
}

五、源代碼

BubbleSort

【排序算法】冒泡排序(Bubble Sort)