交換排序 - 兩兩比較待排序列中的關鍵詞,若是次序相反,則交換性能
冒泡排序
- 基本思路
1.從第一個關鍵字開始,比較相鄰的兩個關鍵字
2.若是逆序(假設須要排列爲遞增序列),則交換位置,直到最後一個關鍵字,此時最後一個關鍵字爲最大值
3.重複1,直到一輪排序中,比較至最後兩個關鍵字也沒有發生交換,說明已經順序排列
- 具體實現
- 時間複雜度 - O(n2)
- 最好狀況 - 待排序列爲正序,n-1次比較,無需交換
- 最壞狀況 - 待排序列爲逆序,n-1次排序
快速排序 Quick Sort
- 基本思路
1.在待排序列中選擇一個元素v做爲樞紐元
2.把待排序列分爲3個子序列:小於v;v;大於v
3.對子序列進行排序,獲得最終的順序列
- 具體實現
1.將樞紐元與最後一個記錄交換位置
2.初始化兩個指針:first->record[0](第一個記錄),last->record[i-1](最後第二個記錄)
3.將first向後移動,直到指向第一個超過樞紐元的記錄
4.將last向前移動, 直到指向第一個小於樞紐元的記錄
5.first/last交換位置後, 重複3,4,5,直到first位於last後面
6.此時,將first指向的元素與樞紐元交換位置
- 樞紐元的選擇 - 直接影響快速排序的性能
1.選擇待排序列的第一個或者最後一個記錄
- 在徹底隨機的狀況下能夠,但若是通過預排列,可能子序列的規模會失衡
2.適用隨機數發生器來選擇
+ 優勢 - 比較穩定
+ 缺點 - 生成隨機數的比較費時
3.三數中值分割法
- 選擇第一個記錄,位於中間的記錄和最後一個記錄中的中值
- 存儲結構 - 順序存儲
- 平均時間複雜度 - O(nlog2n)
- 空間複雜度 - 須要額外棧空間