Introsort 內觀排序

2022-01-23 00:43:28 字數 2790 閱讀 9680

.net 4.5 這個版本的array.sort更改了stl的內觀排序演算法,那相對於快速排序內觀排序到底有什麼優化過的呢?

根據維基百科所說,這個排序演算法首先從快速排序開始,當遞迴深度超過一定深度(深度為排序元素數量的對數值)後轉為堆排序。

採用這個方法,introsort既能在常規資料集上實現快速排序的高效能,又能在最壞情況下仍保持 o(n log n) 的時間複雜度。

由於這兩種演算法都屬於比較排序演算法,所以introsort也是乙個比較排序演算法。

按我的理解可以說是快速排序+插入排序+堆排序的混合方式;

優化過的快速排序:

private

static

void introsort(t array, int low, int

height,

int depthlimit, icomparercomparer, bool desc = false

)

if (partitionsize == 2

) else

return

; }

if (partitionsize == 3

) else

return

; }

//使用插入排序演算法

insertionsort(array, low, height, desc);

return

; }

if (depthlimit == 0

) depthlimit--;

//pivotpos劃分後的基準記錄的位置

//對r[low..high]做劃分

int pivotpos =pickpivotandpartition(array, low, height, comparer, desc);

//對右區間遞迴排序

introsort(array, pivotpos + 1

, height, depthlimit, comparer, desc);

//對左區間遞迴排序 因為有個while所以不需要遞迴,相當於quicksort(array,low,pivotpos-1);

height = pivotpos - 1

; }

}

view code

1.利用基於三中值分割槽的中樞值來做快排

//

分治法:三數取中分割法

private

static

int pickpivotandpartition(t keys, int lo, int

hi, icomparer

comparer, bool

desc)

else

//基準

t pivot =keys[median];

//注意:hi-1是因為上面的三數取中演算法已經做了低位和高位比較,

//所以這裡獲取hi-1(前乙個比較),下面的高位實際是高位前乙個位置

//嘗試中間和高位交換

swap(keys, median, hi - 1

);

int left =lo;

//這裡意義是為了下面--right使用,

//如果陣列是5開始遞減應該是3開始,

//因為swap(keys, median, hi - 1);

//已經做了比較減少一位

int right = hi - 1

;

//從區間兩端交替向中間掃瞄,直至left=right為止

while (left

else

//左右碰撞退出掃瞄,準備下次遞迴

if (left >= right) break

;

//進行交換

swap(keys, left, right);

}//pivot 上面做了swap(keys, median, hi - 1);

//中位和高位比較,所以這裡需要基準位置left和高位(hi - 1 同上)交換,

//因為上面迴圈的--right已經跳過比較。

swap(keys, left, hi - 1

);

//基準記錄已被最後定位

return

left;

}

view code

2.設定乙個使用切分時陣列長度的最小值,如果小於這個值,就使用插入排序(這個最小值根據經驗給定,一般設定為16)

//

判斷區間長度少於等於16時候不再使用快讀排序提公升效率

if (partitionsize <=introsortsizethreshold)

if (partitionsize == 2

) else

return

; }

if (partitionsize == 3

) else

return

; }

//使用插入排序演算法

insertionsort(array, low, height, desc);

return

;}

view code

3.監視快排的遞迴深度,以確保高效的處理。如果快排遞迴深度超過log(n)級,那麼內觀排序切換到堆排序

if (depthlimit == 0

) depthlimit--;

view code

STL的內觀排序 introsort 演算法學習筆記

stl standard template library 的演算法據說是經過精心優化的。那麼在它的排序演算法方面做了哪些優化呢?自從快速排序演算法出世以後,從平均效能上來說,除了在資料量極少 20 的的情況下其效能不如插入排序外,快速演算法的效能起碼是其他同階演算法的2到3倍,這也已經是教科書裡不...

價值觀 本能和內驅力

人在實現自身慾望和需求的過程中以及在接受教育 體驗生活和社會 實踐中會形成價值觀。這種價值觀完全是無意識的,它的作用是產生實現 生理和心理平衡的驅動力,以支配人的判斷和選擇,即態度和行為指向。電腦沒有生命,沒有主體的慾望 需求 情感和意志,沒有自發的心理平 衡驅動力,如果賦予它智慧型,就需要給它的智...

自然 接納 內觀 為所當為

自然是什麼,就是一切的存在。順其自然是什麼,就是不要去改變一切的存在,不要去阻止一切的存在。就如江河之水奔流向海,我們不要去逆之,也根本逆之不了,我們只是站在岸邊看著一江春水向東流而已。接納是什麼,就是承認,就是不改變什麼,就讓它如此。任何試圖改變什麼的,都不是接受。這仍如江河之水奔流向海,我們不要...