解析递归行为&&递归的时间复杂度
解析递归行为
引例:利用查找数组最大值
public static void main(String[] args) {
int[] arr = {4, 3, 2, 1};
int max = getMax(arr, 0, arr.length - 1);
System.out.println(max);
}
public static int getMax(int[] arr, int left, int right) {
if (left == right) {
return arr[left];
}
int mid = (left + right)/2;
int leftMax = getMax(arr, left, mid);
int rightMax = getMax(arr, mid+1, right);
return Math.max(leftMax,rightMax);
}
- 递归就是压栈的过程,将代码的行数,形参统统记录到栈中
- 一个函数调子过程的时候,一定会先将自己压入栈中,将信息完成保存;子过程返回结果后会利用之前保存的信息还原先前调用的执行顺序。
- 任何递归行为都可以改成非递归行为;把系统压栈过程改成自己压栈 ->变成迭代
递归的时间复杂度
递归引出归并排序
- 时间复杂度
归并排序代码
思想步骤:
- 左侧排好
- 右侧排好
- 合并
public static void sortProcess(int[] arr, int left, int right) {
if (left == right) return;
int mid = left + ((right-left)>>1);
sortProcess(arr,0,mid);
sortProcess(arr,mid+1,right);
merge(arr,0,mid,right);
}
public static void merge(int[] arr, int left, int mid, int right) {
int[] help = new int[right-left+1];
int i = 0;
int p1 = left;
int p2 = mid+1;
while (p1 <= mid && p2 <= right) {
help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
}
//当其中有一个越界的时候
while (p1 <= mid) {
help[i++] = arr[p1++];
}
while (p2 <= right) {
help[i++] = arr[p2++];
}
// 排序后将辅助数组的值传回给数组
for (int j = 0; j < help.length; j++) {
arr[left+j] = help[j];
}
}
归并排序的应用
- 小和逆序问题