import java.util.Arrays;
/**
* 查找:二分查找、插值查找
* @author
* @create 2021-03-13 9:48
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = new int[]{1,3,5,7,15,23,48};
int res = bianrySearch(arr, 23);
int res1 = binarySearchByRecursion(arr, 23,0,arr.length -1);
int res2 = interpolationSearch(arr,23);
System.out.println(res);
System.out.println(res1);
System.out.println(res2);
}
/**
* 1.1:二分查找
* 查找单个元素的索引,循环写法
* @param arr
* @param target
* @return
*/
public static int bianrySearch(int[] arr, int target){
int left = 0, right = arr.length - 1;
while (left <= right){
int mid = left + (right - left) / 2;//二分查找mid索引公式
if (target > arr[mid]){
left = mid + 1;
}else if (target < arr[mid]){
right = mid - 1;
}else {
return mid;
}
}
return -1;
}
/**
* 1.2 二分查找
* 递归写法
* @param arr
* @param target
* @param left
* @param right
* @return
*/
public static int binarySearchByRecursion(int[] arr, int target, int left, int right){
if (left > right){
return -1;
}
int mid = left + (right - left) / 2;
if (target > arr[mid]){
return binarySearchByRecursion(arr, target, mid + 1, right);
}else if (target < arr[mid]){
return binarySearchByRecursion(arr, target, left, mid-1);
}else {
return mid;
}
}
/**
* 2.插值查找
* @param arr
* @param target
* @return
*/
public static int interpolationSearch(int[] arr, int target){
int left = 0;
int right = arr.length - 1;
while (left <= right){
int mid = left + (right - left)*(target - arr[left])/(arr[right]-arr[left]) ;//插值查找mid索引公式
if (target > arr[mid]){
left = mid + 1;
}else if (target < arr[mid]){
right = mid - 1;
}else {
return mid;
}
}
return -1;
}
}
【算法与数据结构】查找:二分查找、插值查找
最新推荐文章于 2024-09-08 19:37:30 发布