递归

递归排序分析

我们知道递归函数就是函数自己调用自己,下面来分析一下递归函数的具体执行过程。以归并排序中的递归为例:


    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].
在这里插入图片描述
上面是递归调用的大致过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值