C++資料結構 6 快速排序
阿新 • • 發佈:2018-12-13
快速排序演算法是最快的演算法,也是最受歡迎的演算法。
快速排序採用的是分治法,其平均時間複雜度為O(nlogn)
一趟快速排序的演算法是[1]:
1)設定兩個變數I、J,排序開始的時候:I=0,J=N-1; 2)以第一個陣列元素作為關鍵資料,賦值給key,即 key=A[0]; 3)從J開始向前搜尋,即由後開始向前搜尋(J=J-1即J--),找到第一個小於key的值A[j],A[j]與A[i]交換; 4)從I開始向後搜尋,即由前開始向後搜尋(I=I+1即I++),找到第一個大於key的A[i],A[i]與A[j]交換;
5)重複第3、4、5步,直到 I=J; (3,4步是在程式中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指標位置不變。另外當i=j這過程一定正好是i+或j-完成的最後另迴圈結束。)
下面是快速排序的程式碼:
#include <iostream> using namespace std; template<class T> //使用C++函式模板類 void QuickSort(T *a,const int left,const int right) { //快速排序:建立一個基準,所有的元素和基準進行比較,比基準大的放右邊,比基準小的放左邊 //基準可以選最左邊的數或者最右邊的數,之後依次對左右兩邊的數進行遞迴排序 if(left<right) { int i=left; int j=right+1; //加一?小技巧可以使後面的比較變得簡單 int privot=a[left]; //選取左邊的元素作為基準 do{ do i++; while(privot>a[i]); //左邊依次往右遞增,直到遇到比基準大的數停止 do j--; while(privot<a[j]); //右邊的依次往左遞減,直到遇到比基準小的數停止 if(i<=j) swap(a[i],a[j]); //在兩個數沒有交叉時,大的數放右邊,小的數放左邊 ,交換 }while(i<j); swap(a[left],a[j]); //這一步不要忘了,此時結束迴圈a[j]的數比基準小,與基準交換 QuickSort(a,left,j-1); //對左邊的數進行遞迴 QuickSort(a,j+1, right); //對右邊的數進行遞迴 } } int main() { int a[]={0,9,45,78,23,12,45,16,21,32,99}; //最後一個L數是最大的,不做排列使用 QuickSort(a,0,10); for(int i=0;i<10;i++) cout<<a[i]<<endl; //cout << "Hello world!" << endl; return 0; }