將有序數組a的後面隨機一段一插到數組前面,使用相似二分查找的方法,查找一個元素e。java
將有序數組的後面一部分插到數組前面,使用二分查找查找一個元素。數組
public static int binSearch(int[] array, int n) { int lo = 0; int hi = array.length - 1; int mid = (lo + hi) >> 1; while(lo+1 < hi) { mid = (lo + hi) >> 1; if (array[lo] <= array[mid]) //前面一段 if (array[lo] <= n && n <= array[mid]) hi = mid; else lo = mid; else if(array[mid] <= n && n <= array[hi]) lo = mid; else hi = mid; } if(array[lo] == n) return lo; if(array[hi] == n) return hi; return -1; }
The array: 7 8 9 11 14 15 2 3 4 5 Try find 1's index in array: -1 Try find 3's index in array: 7 Try find 5's index in array: 9 Try find 15's index in array: 5 The array2: 9 11 14 1 2 3 4 5 6 7 Try find 1's index in array2: 3 Try find 3's index in array2: 5 Try find 5's index in array2: 7 Try find 15's index in array2: -1
已知方程爲 x^3-x+4 = 0 的根在 [-5, 0] 內,請使用二分查找的求解方法尋找到方程的近似根,要求保留四位小數函數
類二分查找方程的根,能夠將循環判斷條件改變達到目的。測試
public static double result_search(double lo, double hi) { double mid = (lo + hi) / 2; while(hi-lo > 0.00001){ mid = (lo + hi) / 2; if( f(lo)*f(mid) > 0 ){ lo = mid; } else if( f(hi)*f(mid) > 0 ){ hi = mid; } } return mid; } public static double f(double x){ return x*x*x -x + 4; }
Try to search the root of the equation below: x^3 -x + 4 = 0 (Assert there is only one root of the equation) -1.7963
實現二分搜索中若是有多個重複的數,返回最後一個,code
利用二分查找找到目標元素出現的第一個和最後一個位置,只須要對於二分查找的退出條件,作一個簡單的設定就能獲得咱們理想的結果,其餘都跟二分搜索相似io
public static int lastSearch(int[] array, int n) { int lo = 0; int hi = array.length - 1; int mid = (lo + hi) >> 1; while(lo < hi) { mid = (lo + hi + 1) >> 1; if(array[mid] > n) hi = mid - 1; else lo = mid; } if(array[hi] == n) return hi; return -1; }
The array: index: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 value: 2 3 4 4 5 7 8 9 11 11 11 11 14 15 16 16 16 16 Try find 1's last index in array: -1 Try find 3's last index in array: 1 Try find 4's last index in array: 3 Try find 11's last index in array: 11 Try find 16's last index in array: 17