/**
* 使用条件:
* 1、折半查找必须采用顺序存储结果
* 2、关键字必须有序
*/
public class TestBinarySearch {
public static void main(String[] args) {
//定义一个数组
int[] arr = {11,21,31,41,51,61,71,81,91};
System.out.println("非递归实现:"+binarySearch(arr,61));
System.out.println("递归实现:"+recursionSearch(arr,0,arr.length - 1,61));
}
/**
* 非递归实现
*/
static int binarySearch(int[] arr,int key){
//定义开始值和结束值索引
int start = 0;
int end = arr.length - 1;
//查找前的判断 开始值索引大于结束值索引才进行查找
while (start <= end){
//定义中间索引
int mid = (start + end) / 2;
//如果中间索引对应的元素值等于目标值,直接返回中间值索引
if (arr[mid] == key){
return mid;
//中间值比目标值大,说明目标值在开始值和中间值之间 结束值索引变为mid-1
}else if (arr[mid] > key){
end = mid - 1;
//反之,目标值在中间值和结束值之间,开始值索引变为mid+1
}else {
start = mid + 1;
}
}
//查找不到 返回-1
return -1;
}
/**
* 递归实现
*/
static int recursionSearch(int[] arr,int start,int end,int key){
//中间值索引
int mid = (start + end) / 2;
//递归开始条件
while (start <= end){
//中间值等于目标值,直接返回中间值索引
if (arr[mid] == key){
return mid;
}else if (arr[mid] > key){
//中间值大于目标值 结束值索引变为mid-1,继续递归查找
return recursionSearch(arr,start,mid - 1,key);
}else{
//中间值小于目标值,开始值索引变为mid+1,继续递归查找
return recursionSearch(arr,mid + 1,end,key);
}
}
//递归结束 未找到返回-1
return -1;
}
}
运行结果:
标签:折半,arr,java,递归,int,mid,start,key
来源: https://www.cnblogs.com/sinoaccer/p/12118179.html