归并排序是一种很稳定,很快的排序,时间复杂度为O(nlogn),作者很喜欢这个排序
大概思想就是分治,每次找一半,直到就剩一左一右两个元素,比如说{4,8,6,2,3,7}
递归找到最左面的也就是 {4,8}发现有序,然后回溯找右面的发现右面不够两个,再回溯也就是{4,8,6}合并,即{4,8}和{6}合并,取一个temp数组,用来存储合并后有序的这个数组,取左数组和右数组的头,遵循一个思想,谁小就把谁往temp里面放,然后下标++。
public static void merge(int[] nums,int l,int mid,int r,int[] temp){
//初始下标
int lindex=l,rindex=mid+1,tempi=l;
while(lindex<=mid&&rindex<=r){
//谁小放谁,下标++
if(nums[lindex]>nums[rindex]){
temp[tempi++]=nums[rindex++];
}else{
temp[tempi++]=nums[lindex++];
}
}
//可能一个数组都找完了另一个还剩挺多,所以将剩余的都放进temp,因为合并之前单个数组有序,所以可以直接放
while(lindex<=mid) temp[tempi++]=nums[lindex++];
while(rindex<=r) temp[tempi++]=nums[rindex++];
//将合并好的有序的数组放回原数组
for (int i = l; i <=r; i++) {
nums[i]=temp[i];
}
}
public static void sortmerge(int[] nums,int l,int r,int[] temp){
if (l < r) {
//将数组切半
int mid=(l+r)/2;
//递归向左再向右,等两面都有序了再合并
sortmerge(nums, l, mid,temp);
sortmerge(nums, mid+1, r,temp);
merge(nums,l,mid,r,temp);
}
}