演算法設計 快速排序 隨機快速排序演算法

2021-07-02 05:10:55 字數 1146 閱讀 2219

1.演算法流程:

快速排序的時間複雜性分析:

1.最壞情況劃分:當劃分產生的兩個子問題分別包含了n-1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為θ(n),則演算法執行時間的遞迴表示式為t(n)=t(n-1)+t(0)+θ(n).利用代入法可以求得t(n)=θ(n^2).可以證明當陣列完全有序時候,時間複雜度為θ(n^2)

2.最好情況劃分:當partition得到的兩個子問題規模都不大於n/2時候,是最平衡劃分。則遞迴式為t(n)=2t(n/2)+θ(n).根據主定理,可得時間複雜度為θ(nlgn)

3.平衡的劃分:只要劃分是常數比例,就是平衡劃分。例如t(n)=t(9n/10)+t(n/10)+cn.兩個子問題分別為9/10和1/9。利用遞迴樹可以求得複雜度為o(nlgn)

但是為了減少演算法因為初始資料可能已經部分按大小排序,導致演算法複雜性會變成o(n2)進行了隨機選擇方法

在random_partition中隨機產生(p,r)之間的乙個數字,然後交換a[i]與a[r]這樣會使得快速排序演算法的複雜性得到降低。

**實現:

#include

#include

#define datatype int 

void fastsort(datatype a, int left, int right);//快速排序

int random_partition(datatype a,int p,int r)

int x=a[r];

int i=p-1;

for(int j=p;j<=r-1;j++) }}

return i+1;

}void fastsort(datatype a, int left, int right)

}datatype main(void)

printf("排序後的結果是:\n");

fastsort(a, 1,i - 1);

datatype k;

for (k = 1; k <= i - 1; k++)

printf("%d ", a[k]);

return 0;

}

經典快速排序演算法與隨機快速排序演算法

快速排序用到了分治思想,同樣的還有歸併排序。乍看起來快速排序和歸併排序非常相似,都是將問題變小,先排序子串,最後合併。不同的是快速排序在劃分子問題的時候經過多一步處理,將劃分的兩組資料劃分為一大一小,這樣在最後合併的時候就不必像歸併排序那樣再進行比較。但也正因為如此,劃分的不定性使得快速排序的時間複...

快速排序和隨機快速排序

嚴書上的快排是以最左邊元素為樞紐的,如下 include include using namespace std intpartition int a,int left,int right a left p return left void quicksort int a,int left,int ...

快速排序與隨機快速排序

實現對陣列的普通快速排序與隨機快速排序。1 實現上述兩個演算法 2 統計演算法的執行時間 3 分析效能差異,作出總結 一 快速排序 通過使用分治思想對快速排序演算法進行描述。下面對乙個典型的子陣列a p r 進行快速排序的三步分治過程 分解 陣列a p r 被劃分為兩個 可能為空 子陣列a p q ...