1. 程式人生 > >數據結構與算法之美專欄學習筆記-排序優化

數據結構與算法之美專欄學習筆記-排序優化

str 原則 選擇排序 .com 實現一個函數 一個數 原因 通用 並排

選擇合適的排序算法

回顧
技術分享圖片

選擇排序算法的原則

1)線性排序時間復雜度很低但使用場景特殊,如果要寫一個通用排序函數,不能選擇線性排序。

2)為了兼顧任意規模數據的排序,一般會首選時間復雜度為O(nlogn)的排序算法來實現排序函數。

3)同為O(nlogn)的快排和歸並排序相比,歸並排序不是原地排序算法,所以最優的選擇是快排。


優化快速排序

導致快排時間復雜度降為O(n^2)的原因是分區點選擇不合理,

最理想的分區點是:被分區點分開的兩個分區中,數據的數量差不多。

優化分區點有2種常用方法:

三數取中法

從區間的首、中、尾分別取一個數,然後比較大小,取中間值作為分區點。

如果要排序的數組比較大,那三數取中可能就不夠用了,可能要五數取中或者十數取中。

隨機法

每次從要排序的區間中,隨機選擇一個元素作為分區點。

遞歸發生堆棧溢出的解決方法

限制遞歸深度,一旦遞歸超過了設置的閾值就停止遞歸。

在堆上模擬實現一個函數調用棧,手動模擬遞歸壓棧、出棧過程,這樣就沒有系統棧大小的限制。

通用排序函數實現技巧

1.數據量不大時,可以采取用時間換空間的思路
2.數據量大時,優化快排分區點的選擇
3.防止堆棧溢出,可以選擇在堆上手動模擬調用棧解決
4.在排序區間中,當元素個數小於某個常數是,可以考慮使用O(n^2)級別的插入排序
5.用哨兵簡化代碼,每次排序都減少一次判斷,盡可能把性能優化到極致

思考

C#中的排序函數都是用什麽排序算法實現的?有哪些優化的技巧?

數據結構與算法之美專欄學習筆記-排序優化