赞
踩
挖坑版是在Hoare版的基础上做了改造,答题思路还是和Hoare版一样。
挖坑版partition单次过程:
下面是单次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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。