寻找中间值角标,右侧先开始查找比中间值小的,然后左侧寻找比中间值大的,然后交换,直到中间值左侧都比中间值小,右侧都比中间值大
public static void main(String[] args) {
int[] nums = {5, 1, 6, 3, 7, 2, 9, 4, 0, 8};
quickSort(nums, 0, nums.length - 1);
System.out.println(Arrays.toString(nums));
}
private static void quickSort(int[] nums, int low, int high) {
// 角标未越界
if (low < high) {
int index = findPartIndex(nums, low, high);
quickSort(nums, low, index - 1);
quickSort(nums, index + 1, high);
}
}
/**
* 找到一个枢轴值,这个临界值左边的数都比这个枢轴值小,右边都比这个枢轴值大
*
* @param nums 数组
* @param low 最左侧索引
* @param high 最右侧索引
* @return 枢轴值的角标
*/
private static int findPartIndex(int[] nums, int low, int high) {
// 临时角标
int i = low;
int j = high;
// 临时值,对比值
int temp = nums[low]; // 5
while (i < j) {
// 先从右侧开始比较,若当前最右侧的值大于等于枢轴值,角标减 1
while (i < j && nums[j] >= temp) {
j--;
}
// 左侧开始比较,若当前最左侧的值小于等于枢轴值,角标加 1
while (i < j && nums[i] <= temp) {
i++;
}
// 到了这一步,就说明右侧找到了一个比枢轴值小
// 而左侧找到了一个比枢轴值大的值
if (i < j) {
// 进行交换,将大的值放在右边,小的值放在左面
int n = nums[j];
nums[j] = nums[i];
nums[i] = n;
}
}
// 出了while循环,说明 i == j ,因为 i 在++ , j 在--
// 将 j 位置上的值赋予最左侧
// 其中 j 就是临界角标
nums[low] = nums[j];
// 将之前的基准值,赋予枢轴值角标位置
nums[j] = temp;
return j;
}