Java实现二分查找

来源:互联网 发布:知乎活跃用户数量 编辑:程序博客网 时间:2024/06/05 15:26
public class BinarySearch {    /**     * 二分查找-非递归     * @param 整数顺序数组     * @param 目标数字     * @return 如果存在则返回元素所在下标,不存在则返回-1     */    public static int search1(int[] arr, int num) {        int min = 0; //最小下标        int max = arr.length - 1; //最大下标        if(num < arr[min] || num > arr[max]) { //先判断num是否在arr下标范围内,不在则返回-1            return -1;        }        while(min <= max) { //用while循环逐次对半缩小查找区间间            //范围最后缩小到只有两个数或一个数时,直接判断,防止所查数字不在数组中而出现死循环            if(min == max-1 || min == max) {                if(arr[min] == num)                    return min;                else if(arr[max] == num)                    return max;                else                    return -1;            }            int middle = (min + max)/2; //定义区间中间元素下标            if(arr[middle] == num) { //当中间元素和num相等时返回                return middle;            } else if (arr[middle] < num) { //num比中间元素大,则去后半段middle-max查找                min = middle;            } else { //num比中间元素小,则去前半段min-middle查找                max = middle;            }        }        return -1;//如果没查到则返回-1    }    /**     * 二分查找-递归     * @param arr 整数顺序数组     * @param num 目标数字     * @param min 区间最小下标     * @param max 区间最大下标     * @return 如果存在则返回元素所在下标,不存在则返回-1     */    public static int search2(int[] arr, int num, int min, int max) {        if(min == max-1 || min == max) {            if(arr[min] == num)                return min;            else if(arr[max] == num)                return max;            else                return -1;        }        int middle = (min + max)/2;        if(num < arr[min] || num > arr[max]) {            return -1;        }        if(num == arr[middle]) {            return middle;        } else if (num < arr[middle]) {            return search2(arr,num,min,middle);        } else {            return search2(arr,num,middle,max);        }    }    public static void main(String[] args) {        //测试非递归        int[] arr = {1,3,5,7,8,10,12};        int index = search1(arr, 7);        if(index == -1)            System.out.println("所查数组无此元素!");        else            System.out.println("元素下标为:" + index);        //测试递归        index = search2(arr, 6, 0, arr.length-1);        if(index == -1)            System.out.println("所查数组无此元素!");        else            System.out.println("元素下标为:" + index);    }}

需要注意的地方在于最后一次二分后,查找范围缩减为1~2个数,这时候需要直接去比较是否有想要查的数;如果不添加判断,当数组元素没有所查的数时,会出现重复最后一次二分无限判断的死循环;测试结果:
元素下标为:3
所查数组无此元素!