# 算法之使用Master Theorem估算时间复杂度

proheart

• 剖析递归行为
• 估算递归行为的时间复杂度

## 例1

``````    static int findMax(int[] arr) throws IllegalArgumentException{
if (arr == null || arr.length == 0) throw new IllegalArgumentException("invalid.");
if (arr.length == 1) return arr[0];
return recursion(arr, 0, arr.length - 1);
}

private static int recursion(int[] arr, int from, int to) {
if (from == to) return arr[from];
int mid = from + (to - from) / 2;
int left = recursion(arr, from, mid);
int right = recursion(arr, mid + 1, to);
return Math.max(left, right);
}``````

log(b,a) = log(2,2) = 1 > d = 0, 所以用推论直接得出复杂度是T(N)=O(N).

## 例2

``````public class MergeSort {
static void mergeSort(int[] arr) {
if (arr == null || arr.length < 2) return;
sort(arr, 0, arr.length - 1);
}

static void sort(int[] arr, int left, int right) {
if (left >= right) return;
int mid = left + (right - left) / 2;
sort(arr, left, mid);
sort(arr, mid + 1, right);
merge(arr, left, mid, right);
}

private static void merge(int[] arr, int left, int mid, int right) {
int[] help = new int[right - left + 1];
// 1. 把arr[left, mid]和arr[mid+1, right]两个子数组归并到辅助数组

// a指向第一个子数组的起始位置，b指向第二个子数组的起始位置，指向辅助数组的起始位置
int i = 0, a = left, b = mid + 1;
// 在a和b不越界的情况下，比较所指的元素，把较小的那个放到辅助数组中
while (a <= mid && b <= right) {
help[i++] = arr[a] <= arr[b] ? arr[a++] : arr[b++];
}
// 若a不越界，说明b已经越界，把左边的子数组剩下的元素依次放入辅助数组
while (a <= mid) {
help[i++] = arr[a++];
}
// 若b不越界，说明a已经越界，把右边的子数组剩下的元素依次放入辅助数组
while (b <= right) {
help[i++] = arr[b++];
}
// 2. 把辅助数组中的元素拷贝回arr数组
for (i = 0; i < help.length; i++) {
arr[left + i] = help[i];
}
}

static boolean checkSorted(int[] arr) {
if (arr.length < 2) return true;
for (int i = 1; i < arr.length; i++) {
if (arr[i] < arr[i - 1]) return false;
}
return true;
}

public static void main(String[] args) {
int n = 1000000;
int[] arr = new int[n];
for (int i = 0; i < n; i++) arr[i] = (int) (Math.random() * n);
mergeSort(arr);
System.out.println(checkSorted(arr));
}
}``````

##### 来刷算法
Learn data structure and algorithm using java.
##### proheart

Developer, Java & Android

38 声望
20 粉丝
0 条评论