數據結構與算法之美專欄學習筆記-排序優化
阿新 • • 發佈:2018-11-11
str 原則 選擇排序 .com 實現一個函數 一個數 原因 通用 並排
選擇合適的排序算法
回顧
選擇排序算法的原則
1)線性排序時間復雜度很低但使用場景特殊,如果要寫一個通用排序函數,不能選擇線性排序。
2)為了兼顧任意規模數據的排序,一般會首選時間復雜度為O(nlogn)的排序算法來實現排序函數。
3)同為O(nlogn)的快排和歸並排序相比,歸並排序不是原地排序算法,所以最優的選擇是快排。
優化快速排序
導致快排時間復雜度降為O(n^2)的原因是分區點選擇不合理,
最理想的分區點是:被分區點分開的兩個分區中,數據的數量差不多。
優化分區點有2種常用方法:
三數取中法
從區間的首、中、尾分別取一個數,然後比較大小,取中間值作為分區點。
如果要排序的數組比較大,那三數取中可能就不夠用了,可能要五數取中或者十數取中。
隨機法
每次從要排序的區間中,隨機選擇一個元素作為分區點。
遞歸發生堆棧溢出的解決方法
限制遞歸深度,一旦遞歸超過了設置的閾值就停止遞歸。
在堆上模擬實現一個函數調用棧,手動模擬遞歸壓棧、出棧過程,這樣就沒有系統棧大小的限制。
通用排序函數實現技巧
1.數據量不大時,可以采取用時間換空間的思路
2.數據量大時,優化快排分區點的選擇
3.防止堆棧溢出,可以選擇在堆上手動模擬調用棧解決
4.在排序區間中,當元素個數小於某個常數是,可以考慮使用O(n^2)級別的插入排序
5.用哨兵簡化代碼,每次排序都減少一次判斷,盡可能把性能優化到極致
思考
C#中的排序函數都是用什麽排序算法實現的?有哪些優化的技巧?
數據結構與算法之美專欄學習筆記-排序優化