快速排序的一種優化演算法(三向切分)

2022-09-15 09:09:15 字數 1681 閱讀 2455

快速排序:

時間複雜度o(n*logn),最壞情況為o(n^2)

空間複雜度o(1)

但是堆疊深度一般情況為o(logn),最壞情況為o(n)

快速排序實現:

partition劃分演算法:

int partition(seqlist r,int i,int

j) //

endwhile

r[i]=pivot; //

基準記錄已被最後定位

return

i;}

//partition

然後,對整個陣列進行遞迴排序:

quicksort(a, p, r)

if p

then q ← partition(a, p, r)

//關鍵

quicksort(a, p, q - 1

) quicksort(a, q + 1, r)

演算法導論中提到的快速排序的優化版本:就地重排

partition(a, p, r)

x ← a[r]

//以最後乙個元素,a[r]為主元

i ← p - 1

for j ← p to r - 1

//注,j從p指向的是r-1,不是r。

doif

a[j] ≤ x

then i ← i + 1

exchange a[i]

a[j]

exchange a[i + 1] a[r]

return i + 1

快速排序什麼時候不適用?元素重複率特別高的時候。

如何優化?三向切分。前後各倆指標,總共四個指標。倆額外的指標指向跟待選元素相同的元素,最後全部置換到中間。

三向切分的好處?重複率高的時候,避免相同元素來回交換,節省交換次數。對於包含大量重複元素的陣列,這個演算法將排序時間從線性對數級降到了線性級別。

三向切分的快速排序

在排序的實際應用中,經常會出現大量重複元素的陣列,比如生日排序。而在這種情況下,快速排序仍有巨大的改進空間,如 乙個元素重複的子陣列就不需要繼續排序了,但演算法卻仍會將它繼續切分為更小的陣列,三向切分的快速排序 正是基於此對 快速排序 的作出的改進。三向切分的快速排序將陣列切分為三部分,分別對應小於...

快速排序與三向切分的快速排序

快速排序 講解的十分生動形象 維護乙個指標lo,維護乙個指標hi,初始時lo指向陣列的第乙個元素,hi指向陣列的最後乙個元素。對於快速排序來說其核心有如下幾點 1.選取乙個元素 一般為陣列的第乙個元素 作為基準,可以生動的想象在基準元素上挖了乙個坑,把基準元素挖了出來,並移植給了臨時變數x 2.既然...

一種快速排序演算法

using system class program for int l 0 l src.length l src count temp l i 3 0xff temp l static void main string args watch.stop console.writeline quick...