排序——快速排序算法
快速排序由C. A. R. Hoare在1962年提出。
它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。快速排序是對冒泡排序的一種改進。
這樣說可能不是很形象,不是很好理解,我舉個例子說明一下:有以下數列:
4 7 2 1 5 8 6 3 第一次選擇4為基準,i=left=0,j=right=7,key=4,從後往前遍歷,3 < 4,互換位置。i=0,j=7,key=4;
3 7 2 1 5 8 6 4 到第二個循環,3<4,因此i = 1,7>4,互換位置。i=1,j=7,key=4;
3 4 2 1 5 8 6 7 轉到循環一,1<4,互換位置。i=1,j=3,key=4;
3 1 2 4 5 8 6 7 循環二,循環滿足條件,直到i==j,跳出大循環,遞歸調用,i = 3處分開成兩個數列。將key=4固定。
3 1 2 基準為3,i=left=0,j=right=2,key=3,從後往前遍歷,2 < 3,互換位置。i=0,j=2,key=3;
2 1 3 到第二循環,結束。key=3固定。
2 1 基準為2,i=left=0,j=right=1,key=2,從後往前遍歷,1 < 2,互換位置。i=0,j=1,key=2;
1 2 到第二循環,結束。
5 8 6 7 基準為5,i=left=4,j=right=7,key=5,從後往前遍歷,結束。key=5固定;
8 6 7 基準為8,i=left=5,j=right=7,key=8,從後往前遍歷,7 < 8,互換位置。i=5,j=7,key=8;
7 6 8 到第二循環,結束。key=8固定。
7 6 基準為7,i=left=5,j=right=6,key=7,從後往前遍歷,6 < 7,互換位置。i=5,j=6,key=7;
6 7 到第二循環,結束。
以上為快排的實現過程(如有疑問,還望指出)
代碼:(C語言):
void qSort(int num[],int left,int right){//第一個和最後一個元素 if(left < right){ int i=left, j=right; int key = num[left];//將第一個元素當作基準 while(i<j){ while(i<j && num[j]>=key) j--; int t=num[i]; num[i]=num[j]; num[j]=t; while(i<j && num[i]<=key) i++; t=num[i]; num[i]=num[j]; num[j]=t; }//固定key在數列中的位置不變,以key為界線遞歸調用重新排序。 qSort(num,left,i-1); qSort(num,i+1,right); } }
排序——快速排序算法