數據結構與算法(DSA)學習筆記之排序
- 數據結構中的一種基本運算,分爲內(部)排序和外(部)排序兩大類。
內排序:待排序的數據量不大,全部數據都可以放入內存,排序操作完全在內存中進行。
外排序:待排序的數據量大,全部數據不能同時放在內存中,需要藉助外存完成排序過程。涉及到數據內外存交換的問題,將數據分批讀到內存中去排序,然後寫入外存中。
常用的排序方法有:
- 插入排序
- 交換排序
- 選擇排序:
- 歸併排序:將兩個或兩個以上的有序序列合併爲一個有序序列。歸併排序就是反覆合併有序序列的過程,由最初的數量衆多的短順串,逐步合併爲一個包含所有數據的結果順串。
- 基數排序
八大排序算法:快速排序、冒泡排序、直接選擇排序、堆排序、歸併排序、直接插入排序、折半插入排序、希爾排序。
幾種內部排序方法的比較:
排序方法 |
最優時間複雜度 |
平均時間複雜度 |
最差時間複雜度 |
穩定性 |
插入排序 |
O(n) |
O(n^2) |
O(n^2) |
穩定 |
冒泡排序 |
O(n^2) |
O(n^2) |
O(n^2) |
穩定 |
選擇排序 |
O(n^2) |
O(n^2) |
O(n^2) |
穩定 |
希爾排序 |
O(n^(3/2)) |
不穩定 |
||
快速排序 |
O(n log n) |
O(n log n) |
O(n^2) |
不穩定 |
歸併排序 |
O(n log n) |
O(n log n) |
O(n log n) |
穩定 |
堆排序 |
O(n log n) |
O(n log n) |
O(n log n) |
不穩定 |
基數排序 |
O(n log n) |
O(n log n) |
O(n log n) |
穩定 |
大多數情況下,我們用平均時間複雜度來衡量一個排序算法的優劣。
在幾種排序算法中,如果考慮平均時間複雜度的話,快速排序算法性能最好,歸併排序次之,堆排序最差;特別是當待排序數據量n很大時,歸併排序優於堆排序。
有算法理論證明,任何一種內部排序算法所能達到的最佳時間複雜度爲O(n log n)。
通常,平均時間複雜度爲O(n^2)的排序算法基本上是穩定的。