最近有個面試題,無序數組二分查找?不知道哪位變態要這么搞?有排序的功夫直接遍歷查詢不好嗎?
無序數組二分,如果不排序,真不知道用二分法怎么搞,想用遞歸,搞了半天也沒搞出來。
最后還是先排序,另一個數組保存排序前后的對應下標關系,二分法找到排序后的目標元素下標,根據下標關系數組獲取原始下標。
package mianshi.算法.二分查找法.面試._1; public class MyBinaryTest { /** * @param args */ public static void main(String[] args) { //int[] arr = {1,3,4,66,77,88,99}; int[] arr = {1,4,3,99,77,88,66};//{0,2,1,6,4,5,3}{1,3,4,66,77,88,99} // 下標變化數組 int[] indexArr = new int[arr.length]; for(int i=0;i<indexArr.length;i++){ indexArr[i] = i; } // 排序,排序后的下標對應關系。 for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; int indexTemp = indexArr[i]; indexArr[i] = indexArr[j]; indexArr[j] = indexTemp; } } } int index = getBinarySearch(4,arr,indexArr); System.out.println(index); } private static int getBinarySearch(int ele, int[] arr, int[] indexArr) { int min = 0; int max = arr.length - 1; int mid = 0; while(min <= max){ mid = (min + max ) >> 1; if(ele > arr[mid]){ min = mid + 1; } if(ele < arr[mid]){ max = mid - 1; } if(ele == arr[mid]){ return indexArr[mid]; } } return -1; } }