排序:按關鍵字的非遞減或非遞增順序對一組記錄重新進行排序的操作。
排序的穩定性:假設i位和j位的值相等,排序前後的i位和j位的前後順序依舊不變,則稱所有的排序方法是穩定的。若有一組關鍵字不滿足要求,則該排序方法就是不穩定的。
排序中依據原則來分類:
插入排序、交換排序、選擇排序、歸併排序、基數排序
排序中依據過程工作量來分類:
簡單排序,時間複雜度O(n2)
先進排序,時間複雜度O(nlog2n) 快速排序、歸併排序、堆排序
基數排序:時間複雜度O(d·n)
插入排序:
直接插入排序:順序查找,時間複雜度O(n2),空間複雜度O(1)
折半插入排序:折半查找,時間複雜度O(n2),空間複雜度O(1),比較次數與待排序序列的初始排列無關。
希爾排序:縮小增量排序,時間複雜度位O(n3/2), 空間複雜度O(1)。
交換排序:
冒泡排序:時間複雜度O(n2),空間複雜度O(1)。
快速排序:時間複雜度O(nlog2n),空間複雜度最好爲O(log2n),最壞爲O(n).
1. 附設兩個指針high和low,設置樞軸關鍵字pivotkry。
2. 從表最右側位置,依次向左搜索第一個關鍵字小於piv的記錄和樞軸記錄交換。
3. 從表的最左側位置,依次向右搜索找到第一個關鍵字大於piv的記錄和樞軸記錄交換。
4. 重複2和3步驟,直到low等於high。
幾趟排序後:
選擇排序:
簡單選擇排序:時間複雜度O(n2),空間複雜度O(1)。選最小。
初始關鍵字:
一趟排序結果: 49 38 65 97 49 13 27 76
二趟排序結果: 13 38 65 97 49 49 27 76
三趟排序結果: 13 27 65 97 49 49 38 76
四趟排序結果: 13 27 38 49 97 49 65 76
五趟排序結果: 13 27 38 49 49 97 65 76
六趟排序結果: 13 27 38 49 49 65 97 76
七趟排序結果: 13 27 38 49 49 65 76 97
堆排序:時間複雜度O(nlog2n),空間複雜度O(1)。樹形選擇排序。反覆進行交換和堆調整。
當父結點的鍵值總是大於或等於任何一個子節點的鍵值時爲最大堆。當父結點的鍵值總是小於或等於任何一個子節點的鍵值時爲最小堆。
堆排序就是將無序序列建立成初堆以後,反覆進行交換和堆調整。
詳細圖解可參考
http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html
歸併排序:時間複雜度O(nlog2n),空間複雜度O(n)。
基數排序:不建立在關鍵字的基礎上。
圖示來源於嚴蔚敏的數據結構C語言版。