演算法導論之快速排序文件

2021-07-11 22:42:48 字數 1749 閱讀 5280

對於包含n個數的輸入陣列來說,快排是一種最壞情況下時間複雜度為o(n*n)的排序演算法。雖然最壞時間複雜度很差,但是快排通常是實際排序中的首選,

以為他的平均效能非常好,它的期望時間複雜度為o(nlgn),而且o(nlgn)中隱含的常數因子非常小。

快排分為兩個部分的函式來實現:函式quicksort(a,p,r)和函式partition(a,p,r)

函式quicksort(a,p,r)體現的是總的快排的功能,函式的偽**如下:

quicksort(a,p,r)(a表示的陣列名,p是陣列的下標,r是陣列的上標,即就是對陣列a[p,r]進行排序)

quicksort(a,p,r)

:if p

q=partition(a,p,r);

quicksort(a,p,q-1);

quicksort(a,q+1,r);

看函式的實現過程,其實就是運用了三步分治法進行排序。找到合適的位置,將陣列分成兩部分,然後對每一部分再次呼叫此函式,不斷重複,直到陣列中的元素有序。

另外乙個函式partition(a,p,r),此函式的實現體現的正好是快排演算法的核心。演算法的思想是:以陣列的最後乙個元素為標桿,每次進行比較和交換,每一輪過後,結果是使得小於等於此元素的所有陣列元素被放置在陣列的一端,剩下的大於此元素的所有元素被放置在陣列的另一端,兩端的分界線剛好是原陣列的最後乙個元素,完成調換過程之後,再對此元素進行調換,將其調換到陣列的分界線所處的位置,此時,相當於此元素一遍的元素全都大於此元素,另一邊的所有元素都小於此元素,即就實現了排序。

partition(a,p,r)函式的偽**如下:

partition(a,p,r)

:x=a[r];

i=p-1;

for j=p to r-1

if a[j]<=x

i=i+1;

exchange a[i] with a[j];

exchange a[i+1] with a[r];

return i+1;

快排的隨機化版本:

在討論快排的平均情況效能的時候,我們的前提假設是:輸入資料的所有排列都是等概率的,但是在實際工程中,這種假設並不總是成立,因此我們可以通過在演算法中引入隨機性,來使得演算法對所有的輸入都能獲得較好的期望效能。從上面的描述可以看到,每次分成兩部分的標準是a[r],即就是要進行排序的這一段陣列a[p,r]的最後乙個元素的值,很容易可以得到,如果每次分的兩部分的長度越相近,最後得到的程式執行時間就越短。但實際工程中的a[r]往往呈現出一種有規律的跡象,因此,我們要對原來的程式稍加改動來實現隨機化。

新增加乙個函式:randomized-partition(a,p,r)

randomized-partition(a,p,r)函式的偽**如下:

randomized-partition(a,p,r)

:i=random(p,r);    //

每次在a[p,r]之間選擇乙個數來與元素a[r]進行交換

exchange a[r] with a[i];

return partition(a,p,r);

此函式的功能就是每次用產生的隨機的值換掉原始的a[r]的值。

此時新的快排不再呼叫partition,而是呼叫randomized-partition

randomized-partition(a,p,r):

if p

q=partition(a,p,r);

randomized-partition(a,p,q-1);

randomized-partition(a,q+1,r);

演算法導論之快速排序

def partition a,p,r x a r 錨點 主元 i p 1 for j in range p,r if a j x i 1a i a j a j a i a i 1 a r a r a i 1 return i 1 defquicksort a,p,r if p r 分治 q par...

演算法導論之快速排序

1 2 author justinzhang3 email uestczhangchao gmail.com4 time 2011年5月11日15 58 405 discription 演算法導論第7章,快速排序演算法實現6 change the previous c to cpp,and usin...

快速排序 演算法導論

對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 的排序演算法。雖然最壞情況時間的複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能非常好 它的期望時間複雜度是o nlgn 而且o nlgn 中隱含的常數因子非常小,另外,它還能夠進行原址排序,甚至在虛存環...