关键点:
- 对于长度小于 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;
}
}
}