快速排序思路(挖坑版),代码实现
Posted 有裂痕的石头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序思路(挖坑版),代码实现相关的知识,希望对你有一定的参考价值。
挖坑版是在Hoare版的基础上做了改造,答题思路还是和Hoare版一样。
挖坑版partition单次过程:
- 选一个基准值,一般选最左或者最右面,把该基准值存在val变量中,因为值存到了变量里,所以可以视为这个位置能放其他值了。
- 定义一个left和一个right引用,left从序列左向右走,right相反(如果基准值在左边则right先走,如果基准值在右边,left先走)
- 走的过程中,如果right遇到小于val的数,则把个数放在坑中,并在次形成坑位,然后left向右走,如果遇到大于val的数,则将值填入坑中,此处形成一个坑位,循环下去,直到left和right相遇,这个时候把val的值放到坑中。
下面是单次partition动图演示(图是借的哈哈)
经过单次partition,让val左边的数据全部小于val,右边的数据全部大于val。
然后在去处理val左边子序列和val右边子序列,思路在Hoare版里面已经讲了,这里就不再重复了。
public static void quickSort(int[] array){
//把基准值选在待排序序列的最左边,第一次就是 0 的位置。
quickSortRange(array, 0, array.length - 1);
}
private static void quickSortRange(int[] array, int from, int to) {
int size = to - from + 1;
//递归结束条件
if (size <= 1)
return;
//先处理传入序列,返回值为一次单趟排序之后的基准值的位置,
//基准值左边为左子序列,基准值右边为右子序列
int index = partition(array, from, to);
//处理左子序列
quickSortRange(array, from, index - 1);
//处理右子序列
quickSortRange(array, index + 1, to);
}
public static int partition(int[] array, int from, int to) {
int left = from;
int right = to;
int val = array[left];
while (left < right) {
while (array[right] >= val && right > left)
right--;
array[left] = array[right];
while (array[left] <= val && right > left)
left++;
array[right] = array[left];
}
array[left] = val;
return left;
}
以上是关于快速排序思路(挖坑版),代码实现的主要内容,如果未能解决你的问题,请参考以下文章