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

排序——快速排序算法

一個 -- div ++ 說明 排序 sort int c語言

快速排序由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);
    }
}

排序——快速排序算法