## 标题注意点基本都在注释里有,看注释就好。**
//辅助数组,之后用到
int[] temp;
//总的归并函数,调用下面的函数
public void Merge(int[] nums) {
int n = nums.length;
temp=new int[n];
mergesort(nums, 0, n-1);
}
public void mergesort(int[] nums, int low, int high){
/*安全性校验,还有一个功能:防止一直在一个数的情况下,
mid=low=high,一直这么计算,并且一直递归直到资源耗尽也算不完*/
if (low >= high) {
return;
}
int mid = low + (high - low)/2;
//递归排序
mergesort(nums,low,mid);
mergesort(nums,mid+1,high);
//最后合并,其实合并了好多次,不只是一次
merge(nums, low, mid, high);
}
public void merge(int[] nums, int low, int mid, int high){
int i = low,j = mid+1,ii = low;
/*两个分组,一个从low下标到mid下标(包括mid下标),
一个从mid+1下标到high下标,
同时两个下标i和j遍历俩分组,比较两个下标对应位置的数值,
数值小的放到temp对应的位置上(这里temp数组依靠ii下标来依次插入)*/
while(i<=mid && j<=high){
if (nums[i] <= nums[j]) {
temp[ii++] = nums[i++];
}else{
temp[ii++] = nums[j++];
}
}
/*其中一个分组可能剩下些元素,这些元素都是从小到大排好的,
直接往里插就行*/
while (i <= mid) {
temp[ii++] = nums[i++];
}
while (j <= high) {
temp[ii++] = nums[j++];
}
//必须对原数组一一赋值,因为原数组需要实时改变才能正确往下走
for (int k = low; k <= high; k++) {
nums[k] = temp[k];
}