排序——快速排序算法

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

 Java语言:

public static void qSort(int num[],int left,int right){
        if(left>=right){
            return ;
        }
        int i=left, j=right, key=num[left];
        while(i < j){
            while(i<j && key<=num[j]){    j--;}
            num[i] = num[j];
            while(i<j && key>num[i]){    i++;}
            num[j] = num[i];
        }
        num[j] = key;
        qSort(num,left,i-1);
        qSort(num,i+1,right);
    }

 

posted @ 2017-05-11 13:03  世界和“你”  阅读(170)  评论(0编辑  收藏  举报