#排序演算法#【4】快速排序

範長法@三月軟體發表於2014-05-31

  快速排序法是對氣泡排序的一種改進,本來是要和氣泡排序寫在一個文章裡的,不過前兩天剛開始在遞迴呼叫的時候沒有完全理解,昨天晚上google了一把發現原來自己理解錯了,我看的這個教材沒有寫清楚,今天早上除錯了一把終於成功。

  快速排序演算法的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

  

  快速排序使用分治策略來把待排序資料序列分為兩個子序列,具體步驟為:

    (1)從數列中挑出一個元素,稱該元素為“基準”。

    (2)掃描一遍數列,將所有比“基準”小的元素排在基準前面,所有比“基準”大的元素排在基準後面。

    (3)通過遞迴,將各子序列劃分為更小的序列,直到把小於基準值元素的子數列和大於基準值元素的子數列排序。

     

 

    上圖中只是以69為基準數的兩個步驟的圖示,其實一遍下來以後,應該是比69小的都排在它左邊,比69大的都排在它的右邊。

    貼上一張在萬能的百度中找到的關於快速排序的動畫圖,可能稍微好理解一些:

      

 

具體程式碼如下:

 1 #include <stdio.h>
 2 #include "CreateData.c"  //生成隨機數檔案
 3 
 4 #define MAXSIZE 10
 5 
 6 //快速排序分割出基準數下標
 7 int Partition(int a[],int left,int right){
 8     int base;
 9     base = a[left];
10     while(left < right){
11         while(a[right]>base && left<right)    //右邊的數大於基準數
12             right--;
13         a[left] = a[right];
14 
15         while(a[left]<base && left<right)
16             left++;
17         a[right] = a[left];
18     }
19 
20     a[left] = base;        //儲存基準數
21 
22     return left;
23 }
24 
25 //快速排序演算法實現
26 void QuickSort(int a[],int left,int right){
27     int i;
28 
29     if(left < right){
30         i = Partition(a,left,right);
31 
32         QuickSort(a,left,i-1);
33         QuickSort(a,i+1,right);
34     }
35 }
36 
37 int main(){
38     int a[MAXSIZE];
39     int i;
40 
41     if(!CreateData(a,100,10,MAXSIZE)){
42         printf("生成隨機數失敗\n");
43         return 0;
44     }
45 
46     printf("排序前:");
47     for(i = 0 ; i<MAXSIZE ;i++)
48         printf("%d ",a[i]);
49 
50     QuickSort(a,0,MAXSIZE-1);    
51     
52     printf("\n排序後:");
53     for(i = 0 ; i<MAXSIZE ;i++)
54         printf("%d ",a[i]);
55 
56     return 1;
57 }

 

時間複雜度:O(n*lgn)
最壞:O(n^2)
空間複雜度:O(n*lgn)

快速排序對包含n個數的輸入陣列,平均時間為O(nlgn),最壞情況是O(n^2)。
通常是用於排序的最佳選擇。因為,基於比較的排序,最快也只能達到O(nlgn)。

相關文章