快速排序的經典實現與分析

2021-07-22 01:23:11 字數 1558 閱讀 4379

快速排序是實際應用中效率最高的排序演算法,它的期望時間複雜度是o(nlgn),最壞情況時間複雜度是o(n2)。雖然最壞情況複雜度很高,但是平均期望時間複雜度為o(nlgn),且常數項很小,通過隨機抽樣的改進後,排序的時間複雜度不會受輸入資料的影響。而且演算法的空間複雜度為o(lgn),能夠進行原址排序。

int partition(vector

& tobesorted,int first,int last)

swap(tobesorted[rhsindex],tobesorted[lhsindex]);

return rhsindex;

}}void quicksort(vector

& tobesorted,int first,int last)

上述實現有幾個優點,一是隨機選擇pivot,可以避免對已排序的陣列進行排序時,時間複雜度將退化為o(n2);其次是partition函式中,採用兩端向中間遞推的方法,可以更高效的交換元素,而且對於有大量相同元素的陣列,partition函式還是能將陣列分為較為均勻的兩部分(遇到相同元素時,lhsindex和rhsindex依然會遞進)。

由於partition函式迴圈時,lhsindex 和 rhsindex 只遍歷陣列一次,且swap函式的複雜度為o(1),因此partition函式的複雜度為o(n)。對於平均情況下的快速排序效率,我們可以假設partition函式得到的index的值是隨機的,故:
t(

n)=∑

n−1i

=11n

−1(t

(i)+

t(n−

i−1)

)+o(

n)=∑

n−1i

=12n

−1t(

i)+c

n t

(n+1

)=∑n

i=12

nt(i

)+c(

n+1)

化簡有:t(

n+1)

=n+1

nt(n

)+2c

初始條件t(1)顯然為1,展開t(n)至t(1),有: t(

n+1)

=n+1

n[nn

−1[…

[21t

(1)+

2c]…

]+2c

=(n+

1)t(

1)+2

c(n+

1)(1

n+1+

1n+…

+11)

根據調和級數近似求和公式有: t(

n)=o

(ln(

n))

參見部落格***.

快速排序實現非常簡單,區區十幾行**就能在不利用額外儲存空間的情況下,完成高效的排序,但是缺點是對於已排序的陣列和大量相同元素值的陣列排序時很慢,上文的實現中考慮這兩點進行了改進。但是仍然存在穩定性的問題。除此之外,快速排序遞迴實現會產生很多小陣列,每個小陣列都要呼叫partition函式,降低了效率。解決辦法是利用插入排序排序 小陣列非常高效的特點,設定乙個閾值,當陣列大小達到閾值時,呼叫插入排序。

快速排序的經典實現

快速排序是一種排序演算法,雖然最快情況執行時間為o n n 但快速排序通常是排序的最佳選擇,這是因為它的平均效能好,期望的執行時間為o n logn 而且這個漸進的常數因子很小。下面給出他的c 實現。在程式中是選取了最後乙個元素為主元,當然,在其他的版本中可以選取其他元素作為主元甚至隨機取數來作為主...

快速排序方法Java實現與分析

package paul title 快速演演算法 author 良葛格 author paulliu public class quicksort printarray 用來跟蹤了演算法演算過程 public static void printarray int number sort 開始時,以...

經典快速排序演算法與隨機快速排序演算法

快速排序用到了分治思想,同樣的還有歸併排序。乍看起來快速排序和歸併排序非常相似,都是將問題變小,先排序子串,最後合併。不同的是快速排序在劃分子問題的時候經過多一步處理,將劃分的兩組資料劃分為一大一小,這樣在最後合併的時候就不必像歸併排序那樣再進行比較。但也正因為如此,劃分的不定性使得快速排序的時間複...