內排序演算法總結 快速排序

2021-04-09 07:18:16 字數 2327 閱讀 7686

快速排序

快速排序是一種在含n個數的輸入陣列上最壞情況執行時間為o(n2)的演算法,平均效能的期望執行時間為o(nlgn),且o(nlgn)記號中隱含的常數因子很小。另外,它還能夠進行原地置換排序。

快速排序是基於分治模式上的,分治過程三個步驟:

1.分解:把陣列a[p...r]分成兩個非空子陣列a[p...q]和a[q+1...r],使得a[p...q]的每個元素都小於等於a[q+1...r]中的元素,下標q也在這個劃分過程中進行計算。

2.解決:通過遞迴呼叫快速排序對子陣列a[p...q]和a[q+1...r]排序。

3.合併:因為兩個子陣列是原地排序的,不需要將它們合併,整個陣列a[p...r]已排序。

過程如下:

quicksort(a,p,r)

if pthen q = partition(a,p,r);

quicksort(a,p,q);

quicksort(a,q+1,r);

快速排序演算法的關鍵是partition過程,它對子陣列a[p...r]進行劃分,並得到劃分的界限q:

partition(a,p,r)

x = a[p];

i = p-1;

j = r+1;

while true

do repeat j = j-1

until a[j] <= x

repeat i = i+1

until a[i] >= x

if  ithen swap (a[i] , a [j])

else return j

**如下:

void

swap(

int&

a, int&b)

...

intpartition(

int*

a, int

left, 

intright)

...}

void

quicksort(

int*

a,int

left, 

intright)

...}

void

printarray(

intdata, 

intn)

...printf(""

);}

void

main()

...;

quicksort(a,0,

6);

printarray(a,7);

}

當陣列已經排序好(正序)時,快速排序的的時間代價是o(n2),而這對插入排序只要o(n)的時間

因為此時把陣列劃分為兩部分,分別含1個和n-1個的陣列,而快速排序的最佳情況是兩個子陣列大小都是n/2

改進(隨機化版本):當陣列還沒有被劃分時,可將元素a[p]與a[p...r]中隨機選出的乙個元素交換。

只要把partition函式開頭加入隨機化即可:

randomized_partition(a,p,r)

i = random(p,r)

swap (a[p],a[i])

return partition(a,p,r)

相應地,在quicksort裡呼叫randomized_partition(a,p,r)

**如下:

void

swap(

int&

a, int&b)

...

intpartition(

int*

a, int

left, 

intright)

...}

int

new_random(

intmin, 

intmax)

...

intrandomized_partition(

int*

a, int

left, 

intright)

...

void

randomized_quicksort(

int*

a,int

left, 

intright)

...}

void

printarray(

intdata, 

intn)

...printf(""

);}

void

main()

...;

randomized_quicksort(a,0,

6);

printarray(a,7);

}

另外,還有乙個方案,是在待排序的陣列裡隨機選三個元素,取值為第二大的那個作為基準數也可

排序演算法總結(快速排序)

終於不用改 了,希望文章大修順利!穩定的演算法 不穩定的演算法 內部排序 排序過程不涉及內 外存交換 外部排序 排序過程有內 外存交換 in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基...

排序演算法總結 快速排序

快速排序的一般步驟如下 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數。來自於 啊哈!演算法 這裡需要解釋一下為什麼每次交換的時候都需要右邊的哨兵先走 最主要是相遇點的問題,演算法的...

排序演算法總結 快速排序

前面說的氣泡排序是一種交換排序。交換排序還有一種演算法,就是快速排序演算法。快速排序的核心思想是分而治之。意思就是選出乙個基準 可以是第乙個元素,也可以是最後乙個。為了方便我們選取第乙個 將小於這個基準的全部元素都放在這個基準的左邊,大於這個基準的全部元素都放在基準的右邊。然後分別對左右兩個陣列在進...