演算法導論的C 實現 5 快速排序

2021-10-10 13:03:00 字數 2224 閱讀 1302

對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o(n^2)的排序演算法。雖然最壞情況時間複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能非常好:它的期望時間複雜度是o(nlgn),而且o(nlgn)中隱含的常數因子非常小。

與歸併排序一樣,快速排序也使用了分治思想。下面是對乙個典型的子陣列a[p…r]進行快速排序的三步分治過程:

分解:陣列a[p…r]被劃分為兩個(可能為空)子陣列a[p…q - 1]和a[q + 1…r],使得a[p…q - 1]中的每個元素都小於等於a[q],而a[q]也小於等於a[q + 1…r]中的每個元素。其中,計算下標q也是劃分過程的一部分。

解決:通過遞迴呼叫快速排序,對子陣列a[p…q - 1]和a[q + 1…r]進行排序

合併:因為子陣列都是原址排序的,所以不需要合併操作:陣列a[p…r]已經有序。

void

quiksort

(int

* a,

int l,

int r)

}

排序陣列a時初始應呼叫quiksort(a,1,n)

下面是重點陣列的劃分

int

partition

(int

* a,

int l,

int r)

}int ret = i +1;

int res = a[r]

; a[r]

= a[ret]

; a[ret]

= res;

return ret;

}

partition總是選擇乙個x = a[r]作為主元,並圍繞它來劃分陣列a[p…r]。隨著程式的執行,陣列被劃分成4個(有可能為空的)區域。在3~12行的for迴圈的每一輪迭代的開始,每乙個區域都滿足一定的性質。我們將這些性質作為迴圈不變數:

在3~12行迴圈體的每一輪迭代開始時,對於任意陣列下標k,有:

1.若p<=k<=i,則a[k]<=x。

2.若i+1<=k<=j-1,則a[k]>x。

3.若k=r,則a[k]=x。

快速排序的改良:隨機化快速排序

快速排序的應用:區間第k大

喜聞樂見的源**時間

//快速排序

#include

using

namespace std;

inline

intls

(int x)

inline

intrs

(int x)

inline

intfather

(int x)

constexpr

int maxn =

200;

constexpr

int inf =

0x3f3f3f3f

;int n, n;

int a[maxn]

;int

partition

(int

* a,

int l,

int r)

;void

quiksort

(int

* a,

int l,

int r)

}int

partition

(int

* a,

int l,

int r)

}int ret = i +1;

int res = a[r]

; a[r]

= a[ret]

; a[ret]

= res;

return ret;

}int

main()

quiksort

(a,1

, n)

;for

(int i =

1; i <= n; i++

) cout << endl;

return0;

}

輸入

8

2 8 7 1 3 5 6 4

輸出

1 2 3 4 5 6 7 8

演算法導論 快速排序實現

package search 快速排序演算法導論 public class quicksort1 quicksort1 q new quicksort1 q.quicksort arr,0,arr.length 1 q.print1 arr 合併 public void quicksort int ...

快速排序 演算法導論

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

演算法導論 快速排序

既然敢叫 快速排序 必然有其過人之處。事實上,它確實是最快的通用內部排序演算法。它由hoare於1962年提出,相對歸併排序來說不僅速度快,並且不需要輔助空間。對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 2 的排序演算法。雖然最壞情況時間複雜度差,但是快速排序通常是實際排...