递归排序分析
我们知道递归函数就是函数自己调用自己,下面来分析一下递归函数的具体执行过程。以归并排序中的递归为例:
private static void sort(int[] arr,int left,int right,int []temp){
if(left<right){
int mid = (left+right)/2;
sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序
merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
}
}
我们可以看一下sort中的递归:
输入数组:[8,4,5,7,1,3,6,2],此时left=0,right=7
满足条件,mid=3,
第一步:满足条件,执行第一个sort(),left=0,right=3
第二部:满足条件,执行第一个sort(),left=0,right=1
第三步:满足条件,执行第一个sort(),left=0,right=0
此时不满足递归条件,执行第二个sort(),上一步的mid=0,mid+1=1,上一步的right=1,(此处注意:应为不满足递归条件,所以mid和right都是上一步带下来的。)
8和4独立成数组,将他们两合并成一个有序的数组。此时最深层第一个sort(),递归执行完毕,完成合并。
第四步:返回到上一层,执行上一层的第二个sort(),因为上一层mid=1,right=3,执行和第三步一样的过程,5和7,独立成数组,并将他们合并成一个有序数组,在执行merge,排过序的;两个数组合并此时[4,5,7,8].
第五步:返回上一层,执行上一层的第二个sort(),上一层的mid=3,right=7,步骤和第三步第四步一样,再将右边合并一个有序数组,组后merge,将得到的两个数组合并有序,此时[1,2,3,4,5,6,7,8].
上面是递归调用的大致过程。