无序数组的二分查找法
最近有个面试题,无序数组二分查找?不知道哪位变态要这么搞?有排序的功夫直接遍历查询不好吗?
无序数组二分,如果不排序,真不知道用二分法怎么搞,想用递归,搞了半天也没搞出来。
最后还是先排序,另一个数组保存排序前后的对应下标关系,二分法找到排序后的目标元素下标,根据下标关系数组获取原始下标。
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; } }