关键点:
- 对于长度小于 7 的数组使用插入排序效率更高。
- 使用临时数组
int[] temp = new int[len]。 每次进行区域内的排序时使用函数
System.arraycopy(nums, left, temp, left, right - left + 1);,参数分别表示为被复制的数组、被复制的起点下标、目标数组、目标数组起点下标、复制长度。public class MergeSort {final static int THRESHOLD = 7;public static void sort(int[] nums) {int len = nums.length;int[] temp = new int[len];mergeSort(nums, 0, len - 1, temp);}private static void mergeSort(int[] nums, int left, int right, int[] temp) {if (right - left + 1 <= THRESHOLD) {selectionSort(nums, left, right);return;}int mid = left + (right - left) / 2;mergeSort(nums, left, mid, temp);mergeSort(nums, mid + 1, right, temp);if (nums[mid] <= nums[mid + 1]) {return;}mergeTwoList(nums, left, mid, right, temp);}private static void mergeTwoList(int[] nums, int left, int mid, int right, int[] temp) {System.arraycopy(nums, left, temp, left, right - left + 1);int i = left;int j = mid + 1;for (int k = left; k <= right; k++) {if (i == mid + 1) {nums[k] = temp[j];j++;} else if (j == right + 1) {nums[k] = temp[i];i++;} else if (temp[i] <= temp[j]) {nums[k] = temp[i];i++;} else {nums[k] = temp[j];j++;}}}private static void selectionSort(int[] nums, int left, int right) {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;}}}
