快速排序:
時間複雜度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...