关键点:

    • 对于长度小于 7 的数组使用插入排序效率更高。
    • 使用临时数组 int[] temp = new int[len]
    • 每次进行区域内的排序时使用函数 System.arraycopy(nums, left, temp, left, right - left + 1); ,参数分别表示为被复制的数组、被复制的起点下标、目标数组、目标数组起点下标、复制长度。

      1. public class MergeSort {
      2. final static int THRESHOLD = 7;
      3. public static void sort(int[] nums) {
      4. int len = nums.length;
      5. int[] temp = new int[len];
      6. mergeSort(nums, 0, len - 1, temp);
      7. }
      8. private static void mergeSort(int[] nums, int left, int right, int[] temp) {
      9. if (right - left + 1 <= THRESHOLD) {
      10. selectionSort(nums, left, right);
      11. return;
      12. }
      13. int mid = left + (right - left) / 2;
      14. mergeSort(nums, left, mid, temp);
      15. mergeSort(nums, mid + 1, right, temp);
      16. if (nums[mid] <= nums[mid + 1]) {
      17. return;
      18. }
      19. mergeTwoList(nums, left, mid, right, temp);
      20. }
      21. private static void mergeTwoList(int[] nums, int left, int mid, int right, int[] temp) {
      22. System.arraycopy(nums, left, temp, left, right - left + 1);
      23. int i = left;
      24. int j = mid + 1;
      25. for (int k = left; k <= right; k++) {
      26. if (i == mid + 1) {
      27. nums[k] = temp[j];
      28. j++;
      29. } else if (j == right + 1) {
      30. nums[k] = temp[i];
      31. i++;
      32. } else if (temp[i] <= temp[j]) {
      33. nums[k] = temp[i];
      34. i++;
      35. } else {
      36. nums[k] = temp[j];
      37. j++;
      38. }
      39. }
      40. }
      41. private static void selectionSort(int[] nums, int left, int right) {
      42. for (int i = left + 1; i <= right; i++) {
      43. int temp = nums[i];
      44. int j = i;
      45. while (j > left && nums[j - 1] > temp) {
      46. nums[j] = nums[j - 1];
      47. j--;
      48. }
      49. nums[j] = temp;
      50. }
      51. }
      52. }