归并排序分三步:
1.把数组分成左右两部分
2.把左右两部分都当成单独的数组继续分
3.排序:当不能再分的时候,对最小的左右两个数组进行比较排序。这个排序是拿两个数组的第i和j比,i小则j和i++比,把i放进新数组,j小则i和j++比,把j放进新数组里面。
相当于把数组排序分成许多小数组排序。
public int[] merge(int[] nums1,int[] nums2) {
//把传进来的左右数组进行一个一个元素相互比较,i和j比,i小则j和i++比,把i放进新数组,j小则i和j++比,把j放进新数组
int m=nums1.length;
int n=nums2.length;
//创建一个新数组
int[] arr=new int[m+n];
//分别比较两个数组的元素,将小的添加到新数组
int index=0,i=0,j=0;
while(i<m&&j<n){
if(nums1[i]>nums2[j]){
arr[index]=nums2[j];
j++;
}else{
arr[index]=nums1[i];
i++;
}
index++;
}
//将剩余的元素添加到新数组中
while(i<m){
arr[index]=nums1[i];
i++;
index++;
}
while(j<n){
arr[index]=nums2[j];
j++;
index++;
}
return arr;
}
public int[] sort(int[] nums){
//递归中止条件:
if(nums.length==0||nums.length==1){
return nums;
}
//分割成左右两部分
int[] left= Arrays.copyOfRange(nums,0,nums.length/2);
int[] right= Arrays.copyOfRange(nums,nums.length/2,nums.length);
//然后左右两部分分别排序
//把左或右部分继续分割排序
return merge(sort(left),sort(right));
}