遞迴、歸併排序,master公式
阿新 • • 發佈:2018-11-03
遞迴
遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。
- 一個簡單的遞迴例子
public class Test_01 { public static int getMax(int[] arr, int L, int R) { if(L == R) { return arr[L]; } int mid = (L+R)/2; int maxLeft = getMax(arr,L,mid); int maxRight = getMax(arr,mid+1,R); return Math.max(maxLeft, maxRight); } public static void main(String[] args) { int[] arr = {4,3,2,1}; System.out.println(getMax(arr,0,arr.length-1)); } }
歸併排序
- 時間複雜度:O(N*logN)
- 空間複雜度O(N)
public static void mergeSort(int[] arr) { if (arr == null || arr.length < 2) { return; } mergeSort(arr, 0, arr.length - 1); } public static void mergeSort(int[] arr, int l, int r) { if (l == r) { return; } int mid = l + ((r - l) >> 1);//(L+R)/2 mergeSort(arr, l, mid); mergeSort(arr, mid + 1, r); merge(arr, l, mid, r); //T(N) = 2 T(N/2) + T(n) 時間複雜度 } public static void merge(int[] arr, int l, int m, int r) { int[] help = new int[r - l + 1]; int i = 0; int p1 = l; int p2 = m + 1; while (p1 <= m && p2 <= r) { help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++]; } while (p1 <= m) { help[i++] = arr[p1++]; } while (p2 <= r) { help[i++] = arr[p2++]; } for (i = 0; i < help.length; i++) { arr[l + i] = help[i]; } }
master公式
master公式的使用
T(N) = a*T(N/b) + O(N^d)
- log(b,a) > d -> 複雜度為O(N^log(b,a))
- log(b,a) = d -> 複雜度為O(N^d * logN)
- log(b,a) < d -> 複雜度為O(N^d)