排序算法之六 快速排序

来源:互联网 发布:java中如何声明变量 编辑:程序博客网 时间:2024/06/05 15:16

快速排序(Quick sort),是一种分治算法的实现,其思想为:在待排序数列里面选择一个基准(pivot)将数列分为两个部分,其中基准之前的部分都比基准值小,后半部分大于基准值,这个操作称之为分区(partition);然后分别对前后半部分进行分区操作。

算法示例:

待排序数组:10 6 3 7 2 8 9 2 4 1   n = 10

  首先进行分区。令 left 表示左边界,right 表示右边界,pivot表示基准值。left = 0,right = 9,pivot = d[left]。

  然后,从右向左遍历(right--)找到第一个小于pivot的位置,此时为 right = 9。令 d[left] = d[right],left++。

             得到: 1 6 3 7 2 8 9 2 4 1

  然后,从左向右遍历(left ++)找到第一个大于pivot的位置,此时 left = 9。因为 left == right,所以退出循环。

  最后,令 d[left] = pivot,得到分好区的数列:1 6 3 7 2 8 9 2 4 10,返回基准值的位置 left = 9。

  分好区之后,以基准值位置为界对前后两部分的数组进行分区操作,最后就得到了排好序的数组。

int partition(double *dataIn, int iLeft, int iRight){/* 2012/08/24, by wbprime@myopera.com */    int left = iLeft, right = iRight;    double pivot = dataIn[left];    while (left < right) {        /* from right to left */        while (left < right && dataIn[right] > pivot) right--;        if (left < right) dataIn[left++]  = dataIn[right];        /* from left to right */        while (left < right && dataIn[left]  < pivot) left ++;        if (left < right) dataIn[right--] = dataIn[left] ;    }    dataIn[left] = pivot;    return left;}int quickSort(double *dataIn, int iLeft, int iRight){/* 2012/08/24, by wbprime@myopera.com */    if (iLeft < iRight) {        int index = partition(dataIn, iLeft, iRight);        quickSort(dataIn, iLeft, index-1);        quickSort(dataIn, index+1, iRight);    }}void sort(double *dataIn, int sizeIn){/* 2012/08/24, by wbprime@myopera.com */    quickSort(dataIn, 0, sizeIn-1);}