排序算法之六 快速排序

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值