当前位置:   article > 正文

快速排序思路(挖坑版),代码实现_快速排序挖空法代码

快速排序挖空法代码

挖坑版是在Hoare版的基础上做了改造,答题思路还是和Hoare版一样。
挖坑版partition单次过程:

  1. 选一个基准值,一般选最左或者最右面,把该基准值存在val变量中,因为值存到了变量里,所以可以视为这个位置能放其他值了。
  2. 定义一个left和一个right引用,left从序列左向右走,right相反(如果基准值在左边则right先走,如果基准值在右边,left先走)
  3. 走的过程中,如果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;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/1002826
推荐阅读
相关标签
  

闽ICP备14008679号