读书人

快速排序的兑现

发布时间: 2013-10-08 16:38:32 作者: rapoo

快速排序的实现

快速排序的核心思想分为两步:

1.选择任何一个数作为基准数,找到这个基准数的位置

2.基准数一侧的数大于另一侧的数,对两侧进行排序,这是分治的思想


写过很多次都不记得,其实没掌握其思想,找到基准数位置必然要把这个数和所有的数都比较一边,大于这个数的数放到这个数的右边,小于这个数的数放到这个数的左边,最后这个数的位置就确定了

例如我们看一个例子:

int array[6] = {3 , 5 , 1, 2, 4, 6};

我们假定基准数为a[0] = 3, 找3的位置打过程如下:

快速排序的兑现


分析可知,算法结构是这样的:

/****************quick_sort.c made by cfmlovers************/#include <stdio.h>#define ARRAYSIZE 4/*find the position*/int partition(int a[], int l, int r){    int  i = l, j = r, temp = a[i];    while(i < j)    {        while(temp < a[j] && i < j)                j--;        if(i < j)            a[i++] = a[j];        while(a[i] < temp && i < j)                i++;        if(i < j)            a[j--] = a[i];    }       a[i] = temp;    return i;}void quick_sort(int a[], int l, int r){    int position;    if(l < r)    {        position = partition(a, l, r);        quick_sort(a, l, position-1);        quick_sort(a, position+1, r);    }}void main(){    int a[ARRAYSIZE], i;    printf("please input 4 numbers\n");    for(i = 0; i < 4; i++)        scanf("%d",&a[i]);    /*quick sort*/    quick_sort(a, 0, ARRAYSIZE-1);    for(i = 0; i < 4; i++)        printf("%d\n", a[i]);}

快速排序的效率取决于基准数所产生的分区,如果分区平衡和归并排序一样,如果分区不平衡,效率甚至和插入排序一样

读书人网 >编程

热点推荐