java - 算法 - 查找 - 二分查找,插值查找
查找有序数组中数字所在位置。
二分查找:
1、每次取中间的数mid,然后和目标target比较,
1、如果mid < target,对左半区二分查找,
2、如果mid > target, 对右半区二分查找,
3、如果mid = target,则说明找到了,返回值。
递归重复1234直到找到。
public static int binarySearch(int[] a, int left, int right, int target){ if(left > right){ //当left在right右边,说明全部遍历完了仍然没有找到目标,返回 -1; return -1; } int mid = (left + right)/2; int re = -1; if(target < a[mid]){ return binarySearch(a, left, mid - 1, target); //traget比中间的小,说明在左半边 } else if(target > a[mid]){ return binarySearch(a, mid + 1, right, target); //target比中间的大,说明在右半边 } else{ return mid; //说明找到了 } }
插入查找:
过程和二分查找一样,只不过采用函数形式确定mid (防止目标值在数组边缘导致二分法查找次数过多的问题), 预估target离中间值远就把mid调节跨度调大一些,反之就跨度小一点。
public static int insertSearch(int[] a, int left, int right, int target){ if(left > right || target < a[left] || target > a[right]){ //当left在right右边,说明全部遍历完了仍然没有找到目标,返回 -1; return -1; } //int mid = (left + right)/2; int mid = left + (right - left) * (target - a[left]) / ( a[right] - a[left] ); int re = -1; if(target < a[mid]){ return binarySearch(a, left, mid - 1, target); //traget比中间的小,说明在左半边 } else if(target > a[mid]){ return binarySearch(a, mid + 1, right, target); //target比中间的大,说明在右半边 } else{ return mid; //说明找到了 } }