由于新手阶段的我对于归并的代码逻辑并不能很直观的理解代码的执行逻辑,所以本文我将会对于这个归并排序算法进行自我观点的总结,以便后续忘了,回来看看,能快速拾起思路.不会想现在每次都需要花很多时间去理解思路.
java
/**
* 归并排序
*/
数组nums={5,3,4,2,1}
public class Main {
int[] tmp;
public void mergeSort(int[] nums,int left,int right){
if(left>=right) return;//判断数组是否符合原子性,及不能再分
int mid=(left+right)/2;//按照mid=2下标进行数组拆分[5,3,4]和[2,1]
mergeSort(nums,left,mid);//进入做递归
mergeSort(nums,mid+1,right);//进入右递归
//左右递归完后进行比较
int cur1=left,cur2=mid+1,i=0;
while(cur1<=mid && cur2<=right){
//较小的元素放前面
tmp[i++]=nums[cur1]<=nums[cur2]?nums[cur1++]:nums[cur2++];
}
//放入较大的元素
while(cur1<=mid) tmp[i++]=nums[cur1++];
while(cur2<=right) tmp[i++]=nums[cur2++];
//将tmp排好数组赋值给nums
for(int j=left;j<=right;j++) nums[j]=tmp[j-left];
}
}
归并排序可以想成套娃的玩法,将一个复杂的问题分成多个简单的问题,进行解决,就能解决这个复杂的问题,这就是分治思想.归并排序执行顺序和二叉树前序遍历一模一样
