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

Posted 有裂痕的石头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序思路(挖坑版),代码实现相关的知识,希望对你有一定的参考价值。

挖坑版是在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;
    }

以上是关于快速排序思路(挖坑版),代码实现的主要内容,如果未能解决你的问题,请参考以下文章

快速排序(QuickSort),归并排序(MergeSort),堆排序(HeapSort)典型C++代码实现总结

5 行代码实现快速排序(简易版)

Java集合与数据结构——七大排序算法的实现

基于比较的七种常见排序算法

基于比较的七种常见排序算法

基于比较的七种常见排序算法