氣泡排序的基本實現及優化

2021-10-21 04:52:10 字數 3397 閱讀 8034

三、**實現

四、總結

五、參考源

本文所有演算法均以c++實現

o(n2)

in-place

穩定類似於金魚冒泡的物理現象。金魚吐出的氣泡(待排元素)

受到 上浮過程中(每次冒泡迴圈)

的 水壓(公升序/降序)

影響而逐漸變大,冒出水面時氣泡大小最大公升序一次迴圈後最大元素排在最後

具體來說:

每次冒泡迴圈中:相鄰的元素兩兩比較

當乙個元素大於右側相鄰元素時,交換它們的位置

當乙個元素小於或等於右側相鄰元素時,位置不變

此時,最大的數字9就排到了隊尾,此時稱為一次冒泡。

重複冒泡過程,進行(n -1)次冒泡,序列必然有序

因為每一次冒泡過程將遍歷所有的n個元素,且將進行n-1冒泡過程,所以:

平均時間複雜度:o(n2)

最好情況:o(n)

最壞情況:o(n2)

因為僅僅進行了交換,所以:

空間複雜度o(1)

template

<

typename

t>

void

bubblesort

(vector

&nums)

//公升序

}//每一次冒泡的最大值最後一定放在length - 1 - i的位置

}//冒泡過程

}

情景:氣泡排序中時常會遇到未進行完n-1次排序,序列已經有序,但演算法依然繼續執行,浪費了大量的時間。

解決方案:當某次冒泡過程中沒有進行交換時,就說明序列已有序

**實現:

template

<

typename

t>

void

bubblesort

(vector

&nums)

//公升序

}//每一次冒泡的最大值最後一定放在length - 1 - i的位置

if(done)

return

;//排序完成,提前結束

}//冒泡過程

}

情景:序列中本身具有部分有序的片段,但演算法依舊掃瞄過去,造成大量時間浪費。例如:[8, 0, 7,3, 4, 5, 6, 1, 2, 9], 其中3,4,5,6已經處於正確位置無需再遍歷。

解決方案:標記最後一次進行交換的位置,該位置之後均為有序

**實現:

template

<

typename

t>

void

bubblesort

(vector

&nums)

//公升序

}//每一次冒泡的最大值最後一定放在length - 1 - i的位置

if(done)

return

;//排序完成,提前結束

border = lastexchange;

//更新邊界

}//冒泡過程

}

解決方案:按正向、逆向交替的冒泡方式進行雙向冒泡**實現:

template

<

typename

t>

void

doublebubblesort

(vector

&nums)

//使正序列公升序

}//奇數輪,左到右

for(

int j = length -

1- i; j > i;

--j)

//使正序列公升序

}//偶數輪,右到左

}//冒泡過程

}

情景:在一般的氣泡排序中可以優化使得演算法及時結束,跳過無需考慮的部分。這些優化措施在雞尾酒排序中也有相當的優化作用。

解決方案:將上述優化"提前結束演算法"和"跳過有序區"整合入雞尾酒排序中

**實現:

template

<

typename

t>

void

doublebubblesort

(vector

&nums)

//使正序列公升序

}//奇數輪,左到右

if(done)

return

;//排序完成,提前結束

border = lastexchange;

//更新邊界

done =

true

;//重置標記

for(

int j = border; j > i;

--j)

//使正序列公升序

}//偶數輪,右到左

if(done)

return

;//排序完成,提前結束

border = lastexchange;

//更新邊界

}//冒泡過程

}

氣泡排序是最為簡單的一種排序,其實用性低,但邏輯簡單易快速構造。處理較少的資料量時,可以考慮使用。

雙向氣泡排序(雞尾酒排序),是基於氣泡排序的變種版本。再附加上優化改進,雖然在使其有更高的效率、相容性,但其平均時間複雜度依舊為o(n2)

演算法視覺化:

演算法優化:

感謝閱讀!

Java 實現氣泡排序及優化

氣泡排序就是按索引逐次比較相鄰的兩個元素,滿足比較條件,則置換,否則不做改變。其優化手段可以從減少記憶體迴圈和外層迴圈著手。最差的冒泡 public void sort1 int ary system.out.println total time system.nanotime starttime ...

氣泡排序 python實現及優化

氣泡排序原理 1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個 否則,位置不變。2.對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。最後的元素應該會是最大的數。3.針對所有的元素重複以上的步驟,除了最後乙個。4.持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較...

氣泡排序及優化

氣泡排序的基本思路是 每次將相鄰兩個數比較,將小的調到前頭 本例按照從小到大排序 按此規律如果有n個數,則要進行n 1趟比較。在第1趟比較中要進行n 1次兩兩比較,在第 j 趟比較中要進行 n j 次兩兩比較。實現如下 include define n 10 int main for i 0 i n...