package com.wangxiaohu;
import java.util.Arrays;
/**
* 快速排序算法
*/
public class SortQuick {
public static void main(String[] args) {
int[] nums = new int[]{4, 1, 6, 3, 2, 5};
System.out.println(Arrays.stream(nums).sum());
sortQuick(nums);
System.out.println(Arrays.stream(nums).iterator().next());
}
/**
* 快速排序主函数
*
* @param nums
*/
public static void sortQuick(int[] nums) {
// Arrays.sort(nums,0,nums.length-1);
sort(nums, 0, nums.length - 1);
}
/**
* 快速排序核心逻辑
*
* @param nums
* @param lo
* @param hi
*/
private static void sort(int[] nums, int lo, int hi) {
//1. base case
if (lo >= hi) {
return;
}
// 2. 获取分界点索引p
int p = partition(nums, lo, hi);
// 3.分别递归处理分界点左右数组
// 先递归处理左
sort(nums, lo, p - 1);
// 再递归处理右
sort(nums, p + 1, hi);
}
private static int partition(int[] nums, int lo, int hi) {
if (lo == hi) return lo;
// 将 nums[lo] 作为默认分界点 pivot
int pivot = nums[lo];
// j = hi + 1 因为 while 中会先执行 --
int i = lo, j = hi + 1;
while (true) {
// 保证 nums[lo..i] 都小于 pivot
while (nums[++i] < pivot) {
if (i == hi) break;
}
// 保证 nums[j..hi] 都大于 pivot
while (nums[--j] > pivot) {
if (j == lo) break;
}
if (i >= j) break;
// 如果走到这里,一定有:
// nums[i] > pivot && nums[j] < pivot
// 所以需要交换 nums[i] 和 nums[j],
// 保证 nums[lo..i] < pivot < nums[j..hi]
swap(nums, i, j);
}
// 将 pivot 值交换到正确的位置
swap(nums, j, lo);
// 现在 nums[lo..j-1] < nums[j] < nums[j+1..hi]
return j;
}
private static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
11-23
2984
07-12
999
10-11
559