快速排序及其分析

2022-03-16 05:20:54 字數 1495 閱讀 1729

快速排序的平均情況下是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:         a[left] = a[right];
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...