二分查找是在一组排好序的数组里查找某个指定的元素。
例如查找元素7,则如下。

利用Scanner获取一个元素,在数组中查找,先找到数组的中间位置 middle =(left+right)/2; 如果所找的元素小于中间位置的元素,则在该中间位置的左边寻找,并且将middle-1(中间位置已经比过了)值赋给right,在求出左边元素的中间下标,直到找到该元素,右侧的原理相同。
实现如下:
import java.util.Scanner;
public class 二分查找 {
public static void main(String[] args) {
int arr[] = {1,5,7,10,15,20,28,56,79,85};
Scanner sc = new Scanner(System.in);
int val = sc.nextInt();
int index = search(arr,val);
System.out.println(index);
}
/**
*
* @param arr
* @param val 要查找的数
* @return 元素下标
*/
private static int search(int[] arr, int val) {
int right = arr.length - 1;
int left = 0;
while(left <= right) {
int middle = (right + left) / 2;
if (val == arr[middle]) {
return middle;//找到则返回下标
} else if (val < arr[middle]) {
right = middle - 1;//要找得数比中间数小则在左边找
} else {
left = middle + 1;//要找得数比中间数小则在右边找
}
}
return -1;
}
}
附上二分查找的递归方法:
public class 二分查找递归 {
public static void main(String[] args) {
int arr[] = {1,5,7,10,15,20,28,56,79,85};
int index = binarySearch(arr,0,arr.length - 1,10);
System.out.println(index);
}
/**
*
* @param arr
* @param l 左下标
* @param r 右下标
* @param data 数据
* @return
*/
private static int binarySearch(int[] arr, int l, int r, int data) {
int mid = (l + r) / 2;
if(r < l){
return -1;
}
if(arr[mid] == data){
return mid;
}
if(arr[mid] < data){
return binarySearch(arr,mid+1,r,data);
}else{
return binarySearch(arr,l,mid-1,data);
}
}
}