递归
//用递归求数组中L_R范围内最大值
int printMaxNum(int* arr,int L, int R)
{
if(L == R) return;
mid = L + (R-L)>>1;
int leftmax = printMaxNum(arr, L, mid);
int rightmax=printMaxNum(arr, mid+1, R);
int res = max(leftmax,rightmax);
return res;
}
//让arr在L到R范围内有序
void process(int* arr, int L, int R)
{
if(L == R) return;//一个数有序
int mid = L + (R-L)>>1;
process(arr,L,mid);//让L到mid有序
process(arr,mid+1,R)//让mid+1到R有序
merge(arr,L,mid,R);//merge函数在底下
}
求中点位置,一般来说mid = (L+R)*0.5,这样写有一些问题
如果数组长度比较大,L+R可能会溢出,这样算出来的mid是不对的。
所以可以这么写
mid = L + (R-L)*0.5
//下面为右移一位(等同于除2),等同于上面
mid = L + (R-L)》》1
如下图就是递归的底层调用,相当于栈、树的后序遍历