关键点:
- 对于长度小于 7 的数组使用插入排序效率更高。
- 分治的时候使用的是开区间。
public class QuickSort {private static final int THRESHOLD = 7;private static final Random RANDOM = new Random();public static void sort(int[] nums) {int len = nums.length;quickSort(nums, 0, len - 1);}private static void quickSort(int[] nums, int left, int right) {if (right - left + 1 <= THRESHOLD) {selectionSort(nums, left, right);return;}if (left >= right) {return;}int p = partition(nums, left, right);quickSort(nums, left, p - 1);quickSort(nums, p + 1, right);}private static int partition(int[] nums, int left, int right) {int rand = RANDOM.nextInt(right - left + 1) + left;swap(nums, left, rand);int lt = left;int pivot = nums[left];for (int i = left + 1; i <= right; i++) {if (nums[i] < pivot) {lt++;swap(nums, lt, i);}}swap(nums, left, lt);return lt;}private static void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}private static void selectionSort(int[] nums, int left, int right) {if (left >= right) {return;}for (int i = left + 1; i <= right; i++) {int temp = nums[i];int j = i;while (j > left && nums[j - 1] > temp) {nums[j] = nums[j - 1];j--;}nums[j] = temp;}}}
