快速排序及其分析

2021-06-04 22:03:06 字數 1576 閱讀 2512

快速排序的平均情況下是o(nlogn),但是一般都比其他執行時間為o(nlogn)的演算法都要快,因為它隱藏的常數因子比較小,但是在最壞情況之下,快速排序的執行時間是o(n2)。

快速排序採用的思想是分治思想,就像

合併排序演算法

的思想一樣,合併排序演算法是從陣列的中間開始分治,直到分為n個分組,最後分別合併n個分組的解。如下圖,有原始陣列a =

快速排序是找出乙個元素(理論上可以隨便找乙個)作為基準(pivot),然後對陣列進行分割槽操作,使基準左邊元素的值都不大於基準值,基準右邊的元素值都不小於基準值,如此作為基準的元素調整到排序後的正確位置。遞迴快速排序,將其他n-1個元素也調整到排序後的正確位置。最後每個元素都是在排序後的正確位置,排序完成。所以快速排序演算法的核心演算法是分割槽操作,即如何調整基準的位置以及調整返回基準的最終位置以便分治遞迴。

基準的挑選會影響到演算法的效能,一般情況將序列的第乙個元素作為基準。

設兩個指標left和right,乙個從左往右掃瞄,乙個從右往左掃瞄;對於左指標,如果左指標所指的元素的值小於或者等於基準值,那麼指標往右移一位,如果大於基準值,則和基準值交換;同理,對於右指標,如果右指標所指的元素的值大於或者等於基準值,那麼指標往左移一位,如果小於基準值,則和基準值交換。**如下:

int partition(int a, int p, int r)

2:
14:

15:        int a; a=a[left];  a[left] = a[right];  a[right]=a;
16:

17:

while (right > left && a[left] <= privot)

18:
21:

22:         a[right] = a[left];
23:     }
24:

25:     a[left] = privot;
26:

return left;

27: }
void quicksort(int a, int p, int r)

2:
11: }
每次基準的最終位置都是在陣列中間位置,從而使規模為n的問題分為2個規模為n/2的問題,即t(n) = 2t(n/2) + θ(n),用遞迴樹分析或者主定理得到時間t(n) = o(nlogn)。

每次基準的最終位置都是第乙個位置,從而規模為n的問題分為乙個規模為n-1的問題,即t(n) = t(n-1) + θ(n),用遞迴樹分析可得執行時間t(n) = o(n2)。

假設規模為n的問題分為乙個規模為9/10n的問題和規模為1/10n的問題,即t(n) = t(9n/10) + t(n/10) + θ(n),用遞迴樹分析可得t(n) = o(nlogn),而且比分區9:1要更平均(也就是情況更好)的概率為80%,所以在絕大部分情況下快速排序演算法的執行時間為o(nlogn)。

快速排序及其分析

快速排序的平均情況下是o nlogn 但是一般都比其他執行時間為o nlogn 的演算法都要快,因為它隱藏的常數因子比較小,但是在最壞情況之下,快速排序的執行時間是o n2 快速排序採用的思想是分治思想,就像合併排序演算法的思想一樣,合併排序演算法是從陣列的中間開始分治,直到分為n個分組,最後分別合...

排序 快速排序及其優化

在排序中交換數字,達到排序的目的 由於 是c語言寫的,所以需要給出交換函式 如果是c 那麼就直接用交換函式 void swap int left,int right 先標記基準值 這裡先取最後乙個元素為基準值,記錄起來 之後定義兩個指標,然後前後遍歷,找到比基準值大的或者小的的元素的位置,然後進行標...

快速排序及其優化

include include 呼叫c 自帶sort include include include using namespace std define max 1000000 define k 12 ifdef debug define new new normal block,file lin...