关键点:

    • 对于长度小于 7 的数组使用插入排序效率更高。
    • 分治的时候使用的是开区间。
    1. public class QuickSort {
    2. private static final int THRESHOLD = 7;
    3. private static final Random RANDOM = new Random();
    4. public static void sort(int[] nums) {
    5. int len = nums.length;
    6. quickSort(nums, 0, len - 1);
    7. }
    8. private static void quickSort(int[] nums, int left, int right) {
    9. if (right - left + 1 <= THRESHOLD) {
    10. selectionSort(nums, left, right);
    11. return;
    12. }
    13. if (left >= right) {
    14. return;
    15. }
    16. int p = partition(nums, left, right);
    17. quickSort(nums, left, p - 1);
    18. quickSort(nums, p + 1, right);
    19. }
    20. private static int partition(int[] nums, int left, int right) {
    21. int rand = RANDOM.nextInt(right - left + 1) + left;
    22. swap(nums, left, rand);
    23. int lt = left;
    24. int pivot = nums[left];
    25. for (int i = left + 1; i <= right; i++) {
    26. if (nums[i] < pivot) {
    27. lt++;
    28. swap(nums, lt, i);
    29. }
    30. }
    31. swap(nums, left, lt);
    32. return lt;
    33. }
    34. private static void swap(int[] nums, int i, int j) {
    35. int temp = nums[i];
    36. nums[i] = nums[j];
    37. nums[j] = temp;
    38. }
    39. private static void selectionSort(int[] nums, int left, int right) {
    40. if (left >= right) {
    41. return;
    42. }
    43. for (int i = left + 1; i <= right; i++) {
    44. int temp = nums[i];
    45. int j = i;
    46. while (j > left && nums[j - 1] > temp) {
    47. nums[j] = nums[j - 1];
    48. j--;
    49. }
    50. nums[j] = temp;
    51. }
    52. }
    53. }