Java二分查找算法实现
二分法简介:
二分法算法也叫折半查找,是一种在有序数列里查找某个特定的元素的算法。如果要查找的元素在这个列表当中,二分查找获取元素位置,否则返回null。思路:
假如有一个有序数组的元素有1到10,我要查找8这个数的数组的下标。二分法就会获取这个数组的中间值,查看是否跟查找的这个值相同。相同的话就直接返回这个值,大于的话就在中间值跟最大值之间找。再在这个范围内执行同样的操作。直到找到的元素等于查找的元素就返回这个元素的下标。
代码可以分为使用递归的方法和不使用递归的方法。
代码:
public class Erfen {
// 不用递归的二分法
public static int bbb(int[] arr,int key ){
int left = 0;//定义左值
int right = arr.length -1;//定义右值
if (left >=right) {//当左值大于右值提示报错
return -1;
}
while (left <= right) {
int a = (left + right)/2;//取中间值
if(key == arr[a])//等于特定元素返回下标
return a;
if(key >=arr[a])//大于左值等于中间值加1(加1因为中间值已经比较过了)
left = a + 1;
else否则右值等于中间值减1
right = a - 1;
}
return -1;//运行完啦还没有找到这个数就报错。
}
// 使用递归的二分法
public static int aaa(int[] arr,int left,int right,int key ){
if (key>arr[right]||key<arr[left]||right<left) {//满足这些情况就报错
return -1;
}
int a = (left+right)/2;//找到中间值
if(arr[a]>key){//中间值元素大于特定元素就重新进入方法,右值替换中间值减一
return aaa(arr,left,a-1,key);
}else if(arr[a]<key){//中间值元素小于特定元素就重新进入方法,左值替换中间值加一
return aaa(arr,a+1,right,key);
}else{//否则返回中间值
return a;
}
}
public static void main(String[] args) {
//定义数组
int[] a = {1,2,3,4,5,6,7,8,9,10};
//使用递归二分法
int b = aaa(a,0,a.length-1,8);
//使用二分法
int c = bbb(a,8);
System.out.println(a[b]);
System.out.println(a[c]);
}
}
运行结果: