排序優化 如何實現乙個通用的 高效能的排序函式?

2021-10-06 08:42:07 字數 891 閱讀 4127

1.排序演算法一覽表

2.為什選擇快速排序?

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

2)為了兼顧任意規模資料的排序,一般會首選時間複雜度為o(nlogn)的排序演算法來實現排序函式。

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

導致快排時間複雜度降為o(n)的原因是分割槽點選擇不合理,最理想的分割槽點是:被分割槽點分開的兩個分割槽中,資料的數量差不多。如何優化分割槽點的選擇?有2種常用方法,如下:

1.三數取中法

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

②如果要排序的陣列比較大,那「三數取中」可能就不夠用了,可能要「5數取中」或者「10數取中」。

2.隨機法:每次從要排序的區間中,隨機選擇乙個元素作為分割槽點。

3.警惕快排的遞迴發生堆疊溢位(有2種解決方法)

①限制遞迴深度,一旦遞迴超過了設定的閾值就停止遞迴。

②在堆上模擬實現乙個函式呼叫棧,手動模擬遞迴壓棧、出棧過程,這樣就沒有系統棧大小的限制。

1.資料量不大時,可以採取用時間換空間的思路

2.資料量大時,優化快排分割槽點的選擇

3.防止堆疊溢位,可以選擇在堆上手動模擬呼叫棧解決

4.在排序區間中,當元素個數小於某個常數是,可以考慮使用o(n^2)級別的插入排序

5.用哨兵簡化**,每次排序都減少一次判斷,盡可能把效能優化到極致

排序優化 如何實現乙個通用的 高效能的排序函式?

1 三數取中法 我們從區間的首 尾 中間,分別取出乙個數,然後對比大小,取這 3 個數的中間值作為分割槽點。這樣每間隔某個固定的長度,取資料出來比較,將中間值作為分割槽點的分割槽演算法,肯定要比單純取某乙個資料更好。但是,如果要排序的陣列比較大,那 三數取中 可能就不夠了,可能要 五數取中 或者 十...

如何優化乙個氣泡排序

氣泡排序應該是很多人第乙個接觸的排序,比較簡單,不展開講解了 function bubblesort arr return arr 複製 氣泡排序總會執行 n 1 n 2 n 3 2 1趟,但如果執行到當中某一趟時排序已經完成,或者輸入的是乙個有序陣列,那麼後邊的比較就都是多餘的,為了避免這種情況,...

JS優化系列 乙個通用公告系統的實現

之前一篇 js優化系列 從乙個計時器的寫法 js多種實現方式的優劣 的討論讓我學到不少東西,現在再來一篇,拋磚引玉。站點的很多頁面經常需要發一些公告,而每次發公告都需要開發同學手工來操作是很麻煩的,而且經常不夠實時。因此寫了乙個通用公告系統,希望能將這份工作交由產品同學來操作。這裡只寫了 小黃條 一...