冒泡排序【BubbleSort】

冒泡排序

假設初始的數組是[5,4,7,2] 以從小到大排序爲例:

  1. 將第0個元素與第一個元素進行比較, 5 > 4, 所以交換位置, 此時[4,5,7,2]
  2. 將第1個元素與第二個元素進行比較, 5 < 7, 所以保持,此時[4,5,7,2]
  3. 將第2個元素與第三個元素進行比較, 7 > 2, 所以交換位置, 此時[4,5,2,7]

這樣就經過了一輪的冒泡,最後一個元素就是最大的元素了。
根據相同的方法,開始第2輪的排序,再次從第0個元素開始,兩兩比較,此時不再讓最後一個元素來參與比較了,因爲它已經是最大值了。

總結起來:
1. 將相鄰的元素兩兩看作一對。如果第一個比第二個大,就交換他們兩個。
2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。完成一次後,最後的元素會是最大的數。
3. 針對所有的元素重複以上的步驟,除了後面已經排好序的元素,直到沒有任何一對數字需要比較

算法實現

public class BubbleSort {

    public void bubbleSort(int[] arr) {
        if(arr == null) {
            return ;
        }
        for(int i = arr.length - 1; i > 0; i--) {
            for(int j = 0; j < i; j++) {
                if(arr[j] > arr[j+1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }

    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp; 
    }
}

時間複雜度

不考慮初始化數據的情況,需要進行n-1次排序(n爲數組長度),每一次排序需要進行n-i次比較(i爲當前第幾次排序)。所以時間複雜度爲 O(N^2)

如果考慮數據情況,比如一開始數組就是排好序的,那麼在上面的算法中加入一個標誌位,一開始標誌位爲false,當進行過數據交換後,就將標誌位變成true,當完成一次排序後,檢查下標誌位,如果還是爲false,就表明整個數組不再需要交換位置了,此時時間複雜度變爲 O(N)。 但是這只是特殊情況而已,不做參考。

穩定性

假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序算法是穩定的;否則稱爲不穩定的。

通俗地講就是是否能保證排序前兩個相等的數據其在序列中的先後位置順序與排序後它們兩個先後位置順序相同。

冒泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以冒泡排序是一種穩定排序算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章