算法——双轴快排(双指针,分治)

双轴快排在快速排序基础上,使用左右两个基准值,一次操作确定两个值位置,形成三个排序区间。通过移动3个指针k,left,right以及p1,p2指针,不断调整数组元素,优化排序效率。当k<right时,根据元素与基准值关系调整指针位置,实现更高效的排序过程。
摘要由CSDN通过智能技术生成

前置条件:熟悉快速排序
快速排序的核心思想就是找到一个对照值,将所有比该值小的放到左侧,将比该值大的放到右侧,这样就确定了一个值在数组中的最终位置,也形成了两个带排序区间。然后重复以上操作即可。要注意剪枝,即right < left就return。

双轴快排呢就是在快排的基础上将最左侧的值left和最右侧的值right作为两个基准,这样的好处就是一次排序能确定两个值的最终位置,同样也得到了3个确定的区间。

双轴快排需要的变量如下
start,end也就是数组的开始位置和结束位置
left,right,k也就是3指针,分别指向数组的开始位置,结束位置,和开始位置+1,注意这3个指针是移动的哦,我们通过k++的方式遍历整个数组。
然后就是p1和p2分别指向两个对照值。

当k < right的时候,就一直while循环,
如果发现arr[k] < p1,说明arr[k]应该放在left指针的左侧,没有问题吧。所以这个时候我们交换k++的值和++left的值,k++很好理解,以为指针要向前遍历,当前下标处理好了,没有问题。但是为什么要++left呢?因为算法最终会交换arr[left]和arr[start]。
如果发现arr[k] < p2,直接k++就可以了,因为这个值最终位置就是在两个指针中间。
如果发现arr[k] > p2,那么,arr[k]就应放在right指针右侧,这时候我们让right指针–,也就是交换–right和k的值,这儿k不能++因为换过去的值还没有经过比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值