归并排序的核心:先拆解,直到拆成1个或2个数排序,再依次将有序序列合并。
动图:
代码:
public class MergeSort {
public static void main(String[] args){
int[] nums = new int[]{ 8, 9, 1, 7, 2, 3, 5, 4, 6, 0 };
int[] res = sort(nums, 0, nums.length-1);
for(int i=0; i<res.length; i++){
System.out.print(res[i] + " ");
}
}
public static int[] sort(int[] nums, int left, int right){
int mid = (left + right) / 2;
if(left < right){
sort(nums, left, mid);
sort(nums, mid + 1, right);
merge(nums, left, mid, right);
}
return nums;
}
public static void merge(int[] nums, int left, int mid, int right){
int[] temp = new int[right - left + 1];
int i = left;
int j = mid + 1;
int k = 0; // 记录temp数组的下标值
// 依次把小的数放入临时数组中
while (i <= mid && j <= right){
if(nums[i] < nums[j]){
temp[k] = nums[i];
k++;
i++;
}else {
temp[k] = nums[j];
k++;
j++;
}
}
// 将左边剩余的数放入临时数组
while(i <= mid){
temp[k] = nums[i];
k++;
i++;
}
// 将右边剩余的数放入临时数组
while(j <= right){
temp[k] = nums[j];
k++;
j++;
}
// 将临时数组覆盖原数组
for(int x = 0; x < temp.length; x++){
nums[left + x] = temp[x];
}
}
}