[java] 二分法查找

来源:互联网 发布:韩国主播用什么软件 编辑:程序博客网 时间:2024/06/05 07:16

首先上二分法java实现的代码

import java.util.Arrays;public class BinarySearch {    public static int rank(int key, int[] a) {        //数组必须是有序的        int lo = 0;         int hi = a.length - 1;        while(lo <= hi) {            //被查找的键要么不存在,要么必然存在于a[lo...hi]之中            int mid = lo + (hi - lo) / 2;            if(key < a[mid]) {                hi = mid - 1;            }else if(key > a[mid]) {                lo = mid + 1;            }else {                return mid;            }        }        return -1;    }    public static void main(String[] args) {        int[] arr = new int[] {1,2,7,5,9,10};        Arrays.sort(arr);        System.out.println(Arrays.toString(arr));        int index = BinarySearch.rank(7, arr);        System.out.println(index);    }}

要求:传入的数组必须是排好序的
逻辑:先将数组分为中间,左边数组,右边数组。如果要查找的key正好是中间的则反回索引,如果key 大于 arr[mid],则在右面继续查找,反之在左面查找。当到达边界还没找到时,也就是lo==hi时,lo++ 会大于hi,或者 hi– 会小于lo。则循环终止,返回-1

我们先谈谈mid值的计算

//如果数组的长度为奇数 数组正好被平均的分为左右两个要查找数组//如数组为 int[] arr = new int{1,2,3,4,5}//则数组的mid 为  (arr.length - 1) / 2 = 2//mid左边的数组为{1,2}, 右面为 {4, 5}
//如果数组的长度为偶数//如数组为 int[] arr = new int{1,2,3,4,5,6}//则数组的mid 为  (arr.length - 1) / 2 = 2//mid左边的数组为{1,2}, 右面为 {4, 5, 6}
0 0