快速排序法排序

快排的基本思想为:任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后对左右子序列重复该过程,直到所有元素都排列在相应位置上为止。举个例子说明:

对于这个数组来说,

1:选最右边的位置(keyIndex)的值为基准值(key);

2:定义两个索引begin和end;

3:先:begin从左向右找比基准值大的值的位置;

4:然后:end从右向左找比基准值小的值的位置;(为什么先begin后end后面会说)

5:将begin和end位置处的值进行对换;

6:继续重复3,4,5步骤;直至begin等于end时结束;

找位置

交换

begin继续走,此时等于end,结束循环

将begin处的值和keyIndex处的值交换

交换完之后,已begin处为中心,分为两个子序列,begin左边一个,begin右边一个,然后分别对两个子序列重复上述的步骤,直至最后,就可以成功排序这个数组,

begin左边序列,此时的end1可由上面返回的begin值得到,为begin-1

begin右边序列,此时得begin2可由上面返回的begin值得到,为begin+1​​​​​​​

相应得代码如下:

为什么先begin后end:

        先让begin走,是为了确保最后停下或跳出循环的位置处的值是大于key的,这样直接就可以将begin处的值与keyIndex处的值进行交换,使得最终形成左右子序列。

例如:

此处begin和end处值交换后,若让end先找,则end会在值为4的位置处与begin相遇停下

此时跳出循环,交换begin和keyIndex处的值后,就不符合左右子序列分别小于和大于key值,若让begin先走:

则会在值为7的位置处停下,跳出循环后交换begin和keyIndex处的值,即符合要求。

本文章是按最右边值为基准值来说明,若按最左边为基准值也可,步骤类似,只是这时是先end找,然后再begin找,原因与此类似。并且这里的快速排序还没有优化,若是已经是有序或基本有序的序列,则会很慢,即基准值若选的是本数组中最大或最小值,则效率会很慢,所以要选合适的基准值根据三数取中法,后续更新,谢谢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值