有序数组查找算法:二分法和插值法
程序员文章站
2024-03-17 14:56:34
...
/**
* 有序数组的值查找
*/
public class Search {
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6,7,8,9,10};
//int i = binarySearch3(arr, 3);
int i = binarySearch(arr, 91);
System.out.println(i);
}
/**
* 非递归实现二分查找
* @param arr
* @param searchVal
* @return
*/
static int binarySearch(int[] arr,int searchVal){
//初始化左指针
int left=0;
//初始化右指针
int right=arr.length-1;
//当右指针小于左指针时,说明没有找到,退出循环
while(right>=left){
int middle=(left+right)/2;
int midVal=arr[middle];
if(midVal>searchVal){
right=middle-1;
}else if(midVal<searchVal){
left=middle+1;
}else{
return middle;
}
}
return -1;
}
/**
* 递归方式进行二分查找
* @param arr 查找的数组
* @param left 左指针
* @param right 右指针
* @param searchVal 需要查找的值
* @return 如果查找到了返回该值在数组中的下标。否则返回-1
*/
static int binarySearch2(int[] arr,int left,int right, int searchVal ){
if(left>right){
return -1;
}
int middle=(left + right)/2;
int midVal=arr[middle];
if(midVal>searchVal){
return binarySearch2(arr,left,middle-1,searchVal);
}else if(midVal<searchVal){
return binarySearch2(arr,middle+1,right,searchVal);
}else{
return middle;
}
}
/**
* 使用栈实现二分搜索
* 所有的递归都可以用栈来实现。
* @param arr
* @param searchVal
* @return
*/
static int binarySearchByStack(int[] arr,int searchVal){
//初始化左指针
int left=0;
//初始化右指针
int right=arr.length-1;
Stack<Integer> stack = new Stack<>();
stack.push(left);
stack.push(right);
while(true){
int curRight= stack.pop();
int curLeft= stack.pop();
if(curLeft>curRight){
return -1;
}
int middle=(curLeft+curRight)/2;
int midVal=arr[middle];
if(midVal>searchVal){
// right=middle-1;
stack.push(curLeft);
stack.push(middle-1);
}else if(midVal<searchVal){
// left=middle+1;
stack.push(middle+1);
stack.push(curRight);
}else{
return middle;
}
}
}
/**
* 插值查找,和二分法类似,但寻找中间值的方式变了。
* @param arr 查找的数组
* @param left 左指针
* @param right 右指针
* @param searchVal 需要查找的值
* @return 如果查找到了返回该值在数组中的下标。否则返回-1
*/
static int insertSearch(int[] arr,int left,int right, int searchVal){
if(left>right || arr[left]>searchVal || arr[right]<searchVal){
return -1;
}
//和二分法的区别
int middle = left + (right - left) * (searchVal - arr[left]) / (arr[right] - arr[left]);
int midVal=arr[middle];
if(midVal>searchVal){
return binarySearch2(arr,left,middle-1,searchVal);
}else if(midVal<searchVal){
return binarySearch2(arr,middle+1,right,searchVal);
}else{
return middle;
}
}
}
上一篇: 移动端适配的js代码
推荐阅读
-
有序表查找--二分法查找算法 c++实现
-
[C语言]二分法查找(有序数组)
-
二分法在循环有序数组查找元素
-
有序数组查找算法:二分法和插值法
-
二分法查找有序数组中目标值
-
二分法查找有序数组中大于等于v的第一个数
-
在一个有序(增序)数组中查找具体的某个数字n 与二分法查找算法
-
二分法查找有序数组中某元素个数
-
数据结构二分法-给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。
-
Java基础知识回顾第一篇 - 数组和List之间的相互转换 | 二分法查找 | 冒泡排序 博客分类: Java基础知识回顾 冒泡排序二分法查找Java基础