publicstaticintbinarySearch(int[] a, int target) { return recursion(a, target, 0, a.length - 1); }
publicstaticintrecursion(int[] a, int target, int i, int j) { if (i > j) { return -1; } intm= (i + j) >>> 1; if (target < a[m]) { return recursion(a, target, i, m - 1); } elseif (a[m] < target) { return recursion(a, target, m + 1, j); } else { return m; } }
减而治之,每次搜索范围内元素减少一半
快速排序
1 2 3 4 5 6 7 8 9 10 11 12
publicstaticvoidsort(int[] a) { quick(a, 0, a.length - 1); }
privatestaticvoidquick(int[] a, int left, int right) { if (left >= right) { return; } intp= partition(a, left, right); quick(a, left, p - 1); quick(a, p + 1, right); }
privatestaticvoidsplit(int[] a1, int left, int right, int[] a2) { int[] array = Arrays.copyOfRange(a1, left, right + 1); // 2. 治 if (left == right) { return; } // 1. 分 intm= (left + right) >>> 1; split(a1, left, m, a2); split(a1, m + 1, right, a2); // 3. 合 merge(a1, left, m, m + 1, right, a2); System.arraycopy(a2, left, a1, left, right - left + 1); }
分而治之,分到区间内只有一个元素,合并区间
合并K个排序链表 - LeetCode 23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
public ListNode mergeKLists(ListNode[] lists) { if (lists.length == 0) { returnnull; } return split(lists, 0, lists.length - 1); }
public ListNode split(ListNode[] lists, int i, int j) { System.out.println(i + " " + j); if (j == i) { return lists[i]; } intm= (i + j) >>> 1; return mergeTwoLists( split(lists, i, m), split(lists, m + 1, j) ); }
publicclassSqrtLeetcode69 { staticintmySqrt(int x) { inti=1, j = x; intr=0; while (i <= j) { intm= (i + j) >>> 1; if (x / m >= m) { r = m; i = m+1; } else { j = m-1; } } return r; }