1. 程式人生 > >排序演算法值快速排序

排序演算法值快速排序

快速排序演算法:

  快速排序(Quicksort)是對氣泡排序的一種改進。由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

快速排序思想: 

  設要排序的陣列是A[0]……A[N-1],首先任意選取一個數據(通常選用陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,  這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。   一趟快速排序的演算法是:   1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1;   2)以第一個陣列元素作為關鍵資料,賦值給 key
,即 key=A[0];   3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第一個小於 key的值A[j],將A[j]賦給A[i];   4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於 key的A[i],將A[i]賦給A[j];   5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於 key,4中A[j]不大於 key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。

快速排序程式碼:

  

 1 //快速排序,虛擬碼
 2 /*
 3     quickSort(A,s,e);
 4         if(p < r)
 5             q = partition(A,p,r);
 6             quickSort(A,s,q - 1);
 7             quickSort(A,q + 1,e);
 8 */
 9 int partition(int iarr[],int startIndex,int endIndex)
10 {
11     int referenceValue = iarr[startIndex];//
將陣列中第一個元素作為參考 12 int i = startIndex,j = endIndex; 13 while(i < j) 14 { 15 while(iarr[j] >= referenceValue && i < j) j--; //在右邊找到第一個比參考值小的 16 if(i == j) 17 { 18 iarr[i] = referenceValue; 19 break; 20 } 21 else iarr[i] = iarr[j]; 22 while(iarr[i] <= referenceValue && i < j) i++; //在左邊找到第一個比參考值大的 23 if(i == j) 24 { 25 iarr[i] = referenceValue; 26 break; 27 } 28 else iarr[j] = iarr[i]; 29 } 30 return i; 31 } 32 void quickSort(int iarr[],int startIndex,int endIndex) 33 { 34 int pIndex; 35 if(startIndex < endIndex) 36 { 37 pIndex = partition(iarr,startIndex,endIndex); 38 quickSort(iarr,startIndex,pIndex - 1); //一定要減一 39 quickSort(iarr,pIndex + 1,endIndex);  //一定要加一,因為pIndex的位置已排好序。我漏了,調了好久 40 } 41 } 42 int main() 43 { 44 int a[10]={4,1,3,2,16,9,10,14,8,7}; 45 quickSort(a,0,9); 46 for(int i=0;i < 10; ++i) 47 cout << a[i] << " "; 48 return 0; 49 }

複雜度分析:

  最好情況下:O(N*longN);這是快速排序的平均期望值。

  最壞情況:O(N^2);在數列初試狀態正序的情況下發生。

穩定性與否:不穩定!