一、原理介绍
快速排序在一个数组中,会定义一个高位索引和一个低位索引以及一个参照数,参照数的值从原数组中指定一个较为合理的值(一般是低位索引或者是高位索引所在的值),进行排序时,高位索引向左遍历,低位索引向右遍历,由参照数的对面先开始:
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;
}
三、注意点,在快排核心代码的内层循环中,两个循环顺序不可变,必须是处于参照数对面的索引值先开始遍历,否则会有你意想不到的惊喜!具体原因是为啥,请各位看官移步:啊哈算法关于快速排序法为什么一定要从右边开始的原因