快速排序的平均情況下是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...