氣泡排序演算法 細說氣泡排序及其五種優化演算法

2021-10-12 09:08:17 字數 2346 閱讀 1852

01氣泡排序

氣泡排序演算法思想簡單來說:在內層一次遍歷中,arr[j] 與 arr[j - 1] 進行比較,如arr[j - 1] < arr[j], 不改變,反之互換值,保證arr[j]儲存著 0~j - 1中的最大值,隨一次遍歷當前陣列最大值也下沉至末尾,經過n - 1次外層迴圈,可使n - 1個元素下沉,最後乙個元素位置確定,排序完成。

舉個例子方便理解,

例1:例如原陣列為:0,34,66,12,100,98

進入第一次氣泡排序:

從下標1的元素(即34)排起:34與0比較,34大,陣列仍為0,34,66,12,100,98

下標2的元素(即66):66與34比較,66大,陣列仍為0,34,66,12,100,98

下標3的元素(即12):12與66比較,12小,互換位置,陣列變換為0, 34, 12, 66, 100, 98

下標4的元素(即100):100與66比較,100大,陣列仍為0, 34, 12, 66, 100, 98

下標5的元素(即98):98與100比較,98小,則互換位置,陣列變換為0, 34, 12, 66, 98,100

檢視規律,排序過程中,下標 j的值在交換後,是0 ~ j - 1中最大的,利用的是不等號具有傳遞性;排序完成後,將100沉底,再進行新的迴圈時,只需排序0, 34, 12, 66, 98即可,最大值沉底。

具體實現**如下:

02氣泡排序優化

外層優化:即減少外層迴圈次數

舉例2:假設元素陣列為1, 0, 2, 4,8,那麼只需一次內層遍歷即完成了,何須四次?可優化為在每次遍歷中增加乙個tag記錄,如果發生交換,則將tag = false,迴圈結束檢測是否tag發生變化,未發生變化一定是排序完成。

具體實現如下:

內外層迴圈優化:即減少內層和外層循壞次數

如咱們的例1:在一次排序後資料變換為 0, 34, 12, 66, 98,100, 那麼第二次內層遍歷只需遍歷0, 34, 12即可,無需遍歷至0, 34, 12, 66, 98,只需設定乙個next記錄最後交換位置,下一次迴圈就以next為終止。

具體實現如下:

雙向冒泡:一次下沉,一次上浮操作,來回交替

舉例3:1000,2,34,56,343,0,一次下沉和上浮操作排序完成。雖然沒有優化迴圈次數,但大大減少交換次數。

具體實現如下:

雙向冒泡和外層優化一起配合使用

雙向冒泡和內外層優化配合使用

03冒泡優化效率對比

現生成30萬條資料使用以上氣泡排序+五種優化演算法測試,測試結果如下:

問:內外層皆優化演算法為什麼慢於原氣泡排序演算法?

答:和初始資料有關,內外層皆優化中如果多次使用next記錄,但最後乙個數值仍需交換,白白浪費之前賦值時間,再加之邏輯判斷,所以慢於原冒泡演算法,但大部分情況下優於原演算法。

問:優化外層為什麼能比內外層皆優化速度還快?

答:因為在兩者邏輯判斷中boolean型比==快的多,用1億條迴圈測試如下:

問:優化演算法的結果會發生改變嗎?

答:會,因資料和資料量的不同會發生一定變化,特定條件下還可能產生相反的結果。即使採用統一資料,也可能因為對不同演算法產生相反的影響。

細說氣泡排序及其五種優化演算法

氣泡排序演算法思想簡單來說 在內層一次遍歷中,arr j 與 arr j 1 進行比較,如arr j 1 arr j 不改變,反之互換值,保證arr j 儲存著 0 j 1中的最大值,隨一次遍歷當前陣列最大值也下沉至末尾,經過n 1次外層迴圈,可使n 1個元素下沉,最後乙個元素位置確定,排序完成。舉...

排序演算法之五 氣泡排序及其改進

氣泡排序是非常好理解的一種排序,每一次排序都可以確定乙個元素最終的位置 1.對序列從第乙個元素到最後乙個元素遍歷,如果當前元素小於下乙個元素,則交換位置 2.第 i 次遍歷,從第乙個元素到最後 n i 個元素,如果當前元素小於下乙個元素,則交換位置 3.重複2直至第n 1次遍歷,輸出序列 原序列 9...

演算法五 氣泡排序

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