1. 程式人生 > >Java實現氣泡排序(一)

Java實現氣泡排序(一)

原理:每次比較兩個相鄰的元素,將較大的元素交換至右端。

思路:每次氣泡排序操作都會將相鄰的兩個元素進行比較,看是否滿足大小關係要求,如果不滿足,就交換這兩個相鄰元素的次序,一次冒泡至少讓一個元素移動到它應該排列的位置,重複N次,就完成了氣泡排序。

通過一個圖來簡單理解一下一次冒泡的過程【注意:圖中每一豎列是一次比較交換】:

圖中可以看出,經過一次冒泡,6這個當前陣列中最大的元素飄到了最上面,如果進行N次這樣操作,那麼陣列中所有元素也就到到了它本身該在的位置,就像水泡從水中飄上來,所以叫氣泡排序。

下圖就是整個飄的過程:

以上,第五第六次可以看到,其實第五次冒泡的時候,陣列已經是有序的了,因此,還可以優化,即如果當次冒泡操作沒有資料交換時,

那麼就已經達到了有序狀態

程式碼例項:

/**
 * @program: JavaSpecialityDeep
 * @author: Mr.Zerah
 * @create: 2018-10-25 22:52
 * @description: 氣泡排序
 * 氣泡排序只會操作相鄰的兩個資料。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求。
 * 如果不滿足就讓它倆互換。一次冒泡會讓至少一個元素移動到它應該在的位置,重複n 次,
 * 就完成了 n 個數據的排序工作。
 **/
public class BubbleSort {
    public void bubbleSort(Integer[] arr, int n) {
        if (n <= 1) return;       //如果只有一個元素就不用排序了

        for (int i = 0; i < n; ++i) {
            // 提前退出冒泡迴圈的標誌位,即一次比較中沒有交換任何元素,這個陣列就已經是有序的了
            boolean flag = false;
            for (int j = 0; j < n - i - 1; ++j) {        //此處你可能會疑問的j<n-i-1,因為冒泡是把每輪迴圈中較大的數飄到後面,
                // 陣列下標又是從0開始的,i下標後面已經排序的個數就得多減1,總結就是i增多少,j的迴圈位置減多少
                if (arr[j] > arr[j + 1]) {        //即這兩個相鄰的數是逆序的,交換
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
            }
            if (!flag) break;//沒有資料交換,陣列已經有序,退出排序
        }
    }

    public static void main(String[] args) {
        Integer arr[] = {2, 4, 7, 6, 8, 5, 9};
        SortUtil.show(arr);
        BubbleSort bubbleSort = new BubbleSort();
        bubbleSort.bubbleSort(arr, arr.length);
        SortUtil.show(arr);
    }
}

我自己在學習的過程中之前一直很納悶第二層for迴圈裡的j為啥要小於n-i-1,其實這個自己在紙上舉個例子很快就明白了,如果上面程式碼裡我的描述你還沒有看懂,那麼畫一畫。

時間複雜度:

  • 如果我們的資料正序,只需要走一趟即可完成排序。所需的比較次數C記錄移動次數M均達到最小值,

即:Cmin=n-1;Mmin=0;所以,氣泡排序最好的時間複雜度為O(n)

  • 如果很不幸我們的資料是反序的,則需要進行n-1趟排序。每趟排序要進行n-i次比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:

即最壞情況下時間複雜度為O(n2)【n的平方】;

  • 所以,氣泡排序總的平均時間複雜度為:O(n2) 。

 參考: