算法导论-7-2 针对有相同元素值的快速排序

     题目详见算法导论7-2习题,在这里我就不再赘述。

     本文分为三个部分,第一部分是写我改进算法的思路,第二部分是算法实现,第三部分是程序运行结果。

     思路

    《算法导论》里介绍的partition没有考虑元素相等的情况,但是就算存在相同元素快排其实也可以适用的,只是相等的元素当作大于key的元素处理了。习题7-2要求经过partition函数之后与数组变为三个部分,最左边的是小于key(就是原算法里的a[r]),中间部分等于key,最右边大于key。联想到原来的partition函数采用一个变量i来记录小于key的元素的个数,我想可不可以也采用一个变量t来记录小于等于key的元素个数,其中i+1到t是等于key的元素。因此,当出现小于或者等于key的元素t加一,i也要加一。然后按照原来的思想exchange(a[t],a[j])。但是又到了解决问题的关键,只是这样交换一次还不能达到我们的目的,我们必须注意到这个现象从p到i是小于key的元素,从i+1到t是等于key的元素,我们经过exchange(a[t+1],a[j])之后a[t+1]是一个小于等于key的元素,若其小于key我们需要exchange(a[t],a[i]),将小于key的元素交换到最左边,这样我们就成功的将数组里元素分为三部分。

    算法实现


int *partition(int *a,int p,int r)
{
    int key=a[r];
    int i=p-1;
    int t=p-1;
    int j,temp

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值