排序演算法 快速排序(分治法)

2021-07-28 14:59:32 字數 1143 閱讀 2899

思想

快速排序採用的思想是分治思想。

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

舉例說明一下吧,這個可能不是太好理解。

貼上分析**(交流學習):

#include#include/*函式宣告*/

void quicksort(int *a,int p,int r); //快速排序

int partition(int *a,int p,int r); //分治法

void display(int *a,int size); //列印函式

/*主函式*/

int main(int argc, char* argv)

{ int size,*a;

printf("輸入字串長度:\n");

scanf("%d",&size);

if(size > 0) {

printf("請輸入%d個待排序數字:\n",size);

a = (int*)malloc(size*sizeof(int)); //a = new int [size];

for(int i=0; i

分析

快速排序的時間主要耗費在劃分操作上,對長度為k的區間進行劃分,共需k-1次關鍵字的比較。

最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另乙個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少乙個。時間複雜度為o(n*n)

在最好情況下,每次劃分所取的基準都是當前無序區的"中值"記錄,劃分的結果是基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數:o(nlgn)

儘管快速排序的最壞時間為o(n2),但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快者,快速排序亦因此而得名。它的平均時間複雜度為o(nlgn)。

分治法之快速排序演算法

這週的演算法設計與分析的作業,要求是根據所講基本演算法選擇其一,給出具體事例,並且詳細描述演算法實現過程,同時利用一種語言程式設計實現,得出結果。將整個過程詳細整理上傳平台。上週所講演算法也只有那麼幾種 分治法,動態規劃 貪心演算法 回溯法 分值界限。這次用了分治法解決快速排序的問題。快速排序是c....

分治法 快速排序

演算法的思想 將大的問題化為小問題 問題性質不變 快速排序是在比較排序中相對較快,所以稱為快速排序。對於乙個陣列a n 快速排序中分界值需要取n次也就是說,每乙個下標對應的值都需要取一次。源 如下 include using namespace std template int partition ...

快速排序,分治法

平均時間複雜度是 o nlogn 在傳入的陣列為倒序時,將出現最壞的情況,時間複雜度為o n 2 private static void myquicksort int arr,int start,int end int divideindex divide arr,start,end 分治法,按d...