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