算法-快速排序

来源:互联网 发布:中国移动软件开发公司 编辑:程序博客网 时间:2024/06/04 18:11

快速排序的过程:

1.选基准数。

2. j 从右端遍历,寻找比基准数小的数。

3. i 从左端遍历,寻找比基准数大的数。

4. 交换两数的位置,j 沿原位置继续向左寻找,i 继续向右寻找,然后交换位置。

5. 当i = j 时,将 i 位置的数与基准数交换位置,第一次交换结束。

6. 以上次结束的位置为界,将原数列分为左右两个数列分别从1开始递归执行。

7. 递归结束的条件是 i > j。


以下以“ 6 1 2 7 9 3 4 5 10 8”十个数为例说明快速排序的过程。

首先选取6为基准数,i,j 从两端开始遍历,如下图。



当 j 找到5的位置,i 找到7的位置时,两数交换位置。



在5与7交换后,j、i 分别继续寻找,当 j 找到4的位置,i 找到9的位置时两数交换。



当4与9交换后,j、i 继续寻找时出现了j = i,此时将基准数6与3交换。


在6与3交换结束后,6已经归位,接下来的排序中6不需再参与,此时将数列以6为中介分为左右两部分,分别重复以上步骤。


以左端部分为例继续排序,右端也是如此。


当 j = i 时,2与3交换。

交换后3已归位,以3为中介继续切分数列。


排序过程均为以上过程的重复操作,在此不再赘述,源程序如下:

#include <stdio.h>int a[20]={6,1,2,7,9,3,4,5,10,8,0}, n;void quicksort(int left,int right){    int i,j,t,temp;    if(left>right)       return;                                        temp=a[left]; //temp来存储基准数    i=left;    j=right;    while(i != j){        //先从右边向左找        while(a[j]>=temp && i<j)            j--;        //再从左边向右找         while(a[i]<=temp && i<j)            i++;        //交换两个数在数组中的位置        if(i<j){            t=a[i];            a[i]=a[j];            a[j]=t;        }    }    //将基准数归位    a[left]=a[i];    a[i]=temp;                                   quicksort(left,i-1);//继续处理左边的数列     quicksort(i+1,right);//继续处理右边的数列 }int main(){    int i,j,t;    n = 10;    quicksort(0,n);                                      //输出排序结果    for(i=0;i<=n;i++)        printf("%d ",a[i]);    return 0;}


参考博文:http://ahalei.blog.51cto.com/4767671/1365285

0 0
原创粉丝点击