快速排序法是對氣泡排序的一種改進,本來是要和氣泡排序寫在一個文章裡的,不過前兩天剛開始在遞迴呼叫的時候沒有完全理解,昨天晚上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)。