快速排序——Java代码实现以及快排实现注意点

一、原理介绍

快速排序在一个数组中,会定义一个高位索引和一个低位索引以及一个参照数,参照数的值从原数组中指定一个较为合理的值(一般是低位索引或者是高位索引所在的值),进行排序时,高位索引向左遍历,低位索引向右遍历,由参照数的对面先开始:

1、当高位索引处的值遇到比参照数大的值时,暂停遍历;
2、低位索引开始遍历,当低位索引出现比参照数小的值时,暂停遍历;
3、此时将低位索引的值与高位索引的值进行互换;
4、循环上述步骤,直至排序完成。

二、代码实现

public static int[] sort(int[] nums, int low, int high){

        if (low >= high ){
            return nums;
        }

        if (low < 0 || high >= nums.length){
            throw new IllegalArgumentException("传入的低位参数不可小于0,并且传入的高位参数不可大于或等于数组容量");
        }

        int i = low, j = high, reference_num = nums[low];
        while (i < j){

            //注意:快排在先进行遍历的那个数必须在基准数的对面,否则会出错
            while (nums[j] >= reference_num && j > i){
                j--;
            }
            while (nums[i] <= reference_num && i < j){
                i++;
            }

            swap(nums, i, j);
        }
        swap(nums, low, i);

        sort(nums, low, i - 1);
        sort(nums, i + 1, high);
        return nums;
    }

	private static void swap(int[] nums, int i, int j){
        int mid_num = nums[i];
        nums[i] = nums[j];
        nums[j] = mid_num;
    }

三、注意点,在快排核心代码的内层循环中,两个循环顺序不可变,必须是处于参照数对面的索引值先开始遍历,否则会有你意想不到的惊喜!具体原因是为啥,请各位看官移步:啊哈算法关于快速排序法为什么一定要从右边开始的原因

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值