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

2021-10-10 18:05:19 字數 2031 閱讀 5251

氣泡排序演算法思想簡單來說:在內層一次遍歷中,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即可,最大值沉底。

具體實現**如下:

舉例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,一次下沉和上浮操作排序完成。雖然沒有優化迴圈次數,但大大減少交換次數。

具體實現如下:

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

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

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

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

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

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

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

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

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

氣泡排序演算法及其兩種優化

1 排序方法 將被排序的記錄陣列r 1.n 垂直排列,每個記錄r i 看作是重量為r i key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r 凡掃瞄到違反本原則的輕氣泡,就使其向上 飄浮 如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。1 初始 r 1.n 為無序區。2...

氣泡排序演算法及其兩種優化

1 排序方法 將被排序的記錄陣列r 1.n 垂直排列,每個記錄r i 看作是重量為r i key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r 凡掃瞄到違反本原則的輕氣泡,就使其向上 飄浮 如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。1 初始 r 1.n 為無序區。2...