二分查找的思想简单描述:
通过访问数组下标查找对应的值
- 定义数组最左端(left)下标、最右端(right)下标和中间值(middle)下标
- 确定整个查找区间的中间位置middle = (right-left)/2+left
- 用待查值num与中间值arr[middle]作比较
- 若相等,查找成功,直接返回true或对应的下标
- 若小于中间值,则变最右边下标为right = middle-1,在前半个区域进行查找
- 若大于中间值,则变最左边下标为left = middle+1,在后半个区域进行查找
- 依次循环,直到找到或不满足条件,查找结束
1、递归实现二分查找(Boolean)
public class Test {
/**
* 非递归实现二分查找
* @param arr 有效数组
* @param num 查找元素
* @return
*/
public static boolean binarySearch(int[] arr,int num){
int left = 0;//左边下标
int right = arr.length-1;//右边下标
int middle = 0;
while (right>=left){
middle = (right-left)/2+left;
if (num<arr[middle]){
right = middle-1;
}else if (num>arr[middle]){
left = middle+1;
}else {
return true;
}
}
return false;
}
2、非递归实现二分查找
/**
* 递归实现二分查找
* @param arr 有效数组
* @param num 查找得数
* @param left 左边下标
* @param right 右边下标
* @return
*/
public static int Search(int[] arr,int num,int left,int right){
if (left>=right){
return -1;
}
int middle = (right-left)/2+left;
if (num<arr[middle]){
return Search(arr,num,left,middle-1);
}else if (num>arr[middle]){
return Search(arr,num,middle+1,right);
}else {
return middle;//刚好相等
}
}
main函数代码:
public static void main(String[] args) {
int arr[] = {1,3,5,6,7,8,9};
boolean resultPosition = binarySearch(arr,4);
int result = Search(arr,8,0,arr.length-1);
System.out.println("4是否存在:"+resultPosition);
System.out.println("8所在的位置:"+result);
}
测试结果:
4是否存在:false
8所在的位置:5