冒牌排序演算法時間複雜度最壞的情況是,最好的,說明氣泡排序是可以優化的,就看你有沒有去發現。
比較相鄰的元素,判斷是否符合要求,如果不符合就交換位置來達到排序的目的。
對每一對相鄰元素做相同的工作,從開始第一對到結尾的最後一對,一次遍歷之後,最後乙個元素是最大(小)的數。
第二次遍歷重複以上操作,因為最後乙個元素已經確定位置,減少一次計算。以此類推。
示例通過乙個示例來理解基本的氣泡排序演算法,假設當前我們有乙個陣列a,裡面元素是:5,6,1,7,2,4,3
初始狀態
初始狀態[5, 6, 1, 7, 2, 4, 3]發生交換[5, 1, 6, 7, 2, 4, 3]發生交換[5, 1, 6, 2, 7, 4, 3]發生交換[5, 1, 6, 2, 4, 7, 3]發生交換[5, 1, 6, 2, 4, 3, 7]1次遍歷:[5, 1, 6, 2, 4, 3, 7]發生交換[1, 5, 6, 2, 4, 3, 7]發生交換[1, 5, 2, 6, 4, 3, 7]發生交換[1, 5, 2, 4, 6, 3, 7]發生交換[1, 5, 2, 4, 3, 6, 7]2次遍歷:[1, 5, 2, 4, 3, 6, 7]發生交換[1, 2, 5, 4, 3, 6, 7]發生交換[1, 2, 4, 5, 3, 6, 7]發生交換[1, 2, 4, 3, 5, 6, 7]3次遍歷:[1, 2, 4, 3, 5, 6, 7]發生交換[1, 2, 3, 4, 5, 6, 7]4次遍歷:[1, 2, 3, 4, 5, 6, 7]5次遍歷:[1, 2, 3, 4, 5, 6, 7]6次遍歷:[1, 2, 3, 4, 5, 6, 7]
可以發現,我們到第4次遍歷的時候,發現已經排序完了,但是**還是會繼續判斷是否符合要求。
仔細看看,第4次遍歷之前還有一次元數字置交換,第5次遍歷之前已經沒有了交換。
所以我們可以設定乙個標誌位,用來表示當前i 1次是否還有交換,如果有就進行下一趟遍歷,如果沒有,則說明當前陣列已經排完序,沒有再進行比較的判斷了。
初始狀態[5, 6, 1, 7, 2, 4, 3]發生交換[5, 1, 6, 7, 2, 4, 3]發生交換[5, 1, 6, 2, 7, 4, 3]發生交換[5, 1, 6, 2, 4, 7, 3]發生交換[5, 1, 6, 2, 4, 3, 7]1次遍歷:[5, 1, 6, 2, 4, 3, 7]發生交換[1, 5, 6, 2, 4, 3, 7]發生交換[1, 5, 2, 6, 4, 3, 7]發生交換[1, 5, 2, 4, 6, 3, 7]發生交換[1, 5, 2, 4, 3, 6, 7]2次遍歷:[1, 5, 2, 4, 3, 6, 7]發生交換[1, 2, 5, 4, 3, 6, 7]發生交換[1, 2, 4, 5, 3, 6, 7]發生交換[1, 2, 4, 3, 5, 6, 7]3次遍歷:[1, 2, 4, 3, 5, 6, 7]發生交換[1, 2, 3, 4, 5, 6, 7]4次遍歷:[1, 2, 3, 4, 5, 6, 7]
好了這是第一次的優化,減少了計算次數。看上面的執行過程,你覺得還有什麼辦法使得時間複雜度盡可能少一點呢?
我覺得還能再繼續優化,為了更直白一點,這次我們換乙個陣列,陣列元素為:4, 3, 2, 1, 5, 6, 7
看到上面的結果可以看出乙個問題,裡面的for迴圈明明已經歸位了,又增加了不必要的計算次數。問題是在於j < array.length – i – 1。
我們可以這樣解決,進行第1次遍歷之前,記錄交換元素的最後乙個位置lastpostion。交換後的元素後乙個肯定要比前面乙個元素大,lastpostion就記錄前面乙個元素就可以了。
進行一次遍歷之後,lastpostion的記錄有了,裡面的for迴圈進行下標0到lastpostion的陣列就可以了,lastpostion後面的一串陣列由於前面第一次迴圈驗證過了,沒有任何交換的元素 ,說明也是排好序的。
動畫 什麼是希爾排序?
上篇寫的直接插入排序演算法時間複雜度是o n 2 如果要令此排序演算法的時間複雜度要低於o n 2 必須是 遠距離的元素交換 使得這組元素能提高有序的程度,然後進行直接插入排序的時候可以減少交換的工作量。那通過什麼減少交換的工作量呢?希爾排序可以解決這個問題。希爾排序在做直接插入排序之前,希望可以對...
動畫 什麼是希爾排序?
上篇寫的直接插入排序演算法時間複雜度是o n 2 如果要令此排序演算法的時間複雜度要低於o n 2 必須是 遠距離的元素交換 使得這組元素能提高有序的程度,然後進行直接插入排序的時候可以減少交換的工作量。那通過什麼減少交換的工作量呢?希爾排序可以解決這個問題。希爾排序在做直接插入排序之前,希望可以對...
動畫 什麼是桶排序?
桶排序和計數排序一樣,不受o nlogn 時間複雜度下限的影響,它將待排序序列通過遍歷方式分到有限數量的桶中,然後每個桶被單獨地排序,不管是使用同乙個比較類排序演算法或者使用不同的排序演算法,或者還是遞迴地使用桶排序。桶排序可以通過比較方式實現,也可以通過非比較方式實現。通過比較方式的桶排序分為4步...