排序——快速排序

之前总以为自己已经掌握了快速排序,可是眼高手低,没有好好研究一下它是否是稳定的排序,以及涉及重复元素等问题,最近用到时总是出现小的bug,于是又潜心翻看《算法导论》,经过测试,写出一个正确的快速排序算法。

写正确关键在于paration函数:

(1)如果s<=k<=i,则有a[k]<=m(中枢元素)

(2)如果i+1<=k<=j-1,则有a[i]>m

(3)如果k=e,则有a[k]=x

变量s和e分别表示数组a的起始和结尾元素,i用于跟踪j,直到遇到>中枢元素m的值,此时a[i+1]>m,等待下次(如果存在)遇到<=中枢元素m的知,然后交换。

注意:在paration()函数中选择随机中枢元素时,必须基于当前s值(即在当前s上加上随机值)。

 

关于paration的另一种写法如下:

但是这种写法非常容易出错,必须遵循:

(1)如果取中枢元素m=a[e](即结尾元素),必须保证先做low的自增操作,然后是high的自减操作。

(2)如果取中枢元素m=a[s](即起始元素),必须保证先做high的自减操作,然后是high的自增操作。(代码中所示)

否则将会出现错误。测试案例如3,3,3,1,5,2,4等。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值