前置条件:熟悉快速排序
快速排序的核心思想就是找到一个对照值,将所有比该值小的放到左侧,将比该值大的放到右侧,这样就确定了一个值在数组中的最终位置,也形成了两个带排序区间。然后重复以上操作即可。要注意剪枝,即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不能++因为换过去的值还没有经过比较。