快速排序思路(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);

        //处理左子序列
        partition(array, from, index - 1);
        //处理右子序列
        partition(array, index + 1, to);
    }

    /*这是一次单趟排序:
      1、选出一个key,一般是最左边或是最右边的。
     2、定义一个L和一个R,L从左向右走,R从右向左走。
        (需要注意的是:若选择最左边的数据作为key,则需要R先走;若选择最右边的数据作为key,则需要L先走)。
     3、在走的过程中,若R遇到小于key的数,则停下,L开始走,
        直到L遇到一个大于key的数时,将L和R的内容交换,R再次开始走,如此进行下去,
        直到L和R最终相遇,此时将相遇点的内容与key交换即可。(选取最左边的值作为key)
        
        经过一次单趟排序,最终使得key左边的数据全部都小于key,key右边的数据全部都大于key。
    */
    private static int partition(int[] array, int from, int to) {
        int left = from;
        int right = to;
        int key = array[from];

        while (left < right){
            while (array[right] >= key && right > left)
                right--;
            while (array[left] <= key && right > left)
                left++;
            swap(array, left, right);
        }
        //走到这里说明 left == right了,
        //让基准值到中间,方便后续处理左子序列
        swap(array, from, left);

        return left;
    }

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有裂痕的石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值