二分查找算法,java实现

二分查找算法是在有序数组中用到的较为频繁的一种算法。
在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间复杂度为O(n),但二分查找算法则更优,因为其查找时间复杂度为O(log2 n)。
比如数组{0,1,2,3,4,5,6,7,8 9},查找元素6,用二分查找的算法执行的话,其顺序为:
1.第一步查找中间元素,即4,由于4<6,则6必然在4之后的数组元素中,那么就在{5,6,7,8,9}中查找,
2.寻找{5,6,7,8,9}的中位数,为7,7>6,则6应该在7左边的数组元素中,那么只剩下{5,6},按此类推就可以找到了。
二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal进行比较。

public class BinarySearchDemo {
    /**
     * 非递归方法,利用while循环
     *
     * @param arr
     * @param des
     * @return
     */
    public static int binarySearch(int[] arr, int des) {
        int low = 0;
        int high = arr.length - 1;
        while (low <= high) {
//            使用 (low + high) / 2,如果low和high的和大于Integer.MAX_VALUE(在java中是2 23 -1),计算就会发生溢出,使(low + high)成为一个负数,然后被2除,结果当然仍是负数。
//            int middle = (low + high) / 2;
            int middle = low + (high - low) / 2;
            if (arr[middle] == des) {
                return middle;
            } else if (arr[middle] < des) {
                low = middle + 1;
            } else {
                high = middle - 1;
            }
        }
        return -1;
    }

    /**
     * 递归查找
     *
     * @param arr
     * @param des
     * @param low
     * @param high
     * @return
     */
    public static int binarySearch(int[] arr, int des, int low, int high) {
//        int middle = (low + high) / 2;
        int middle = low + (high - low) / 2;
        if (des < arr[low] || des > arr[high] || low > high) {
            return -1;
        }
        if (arr[middle] < des) {
            return binarySearch(arr, des, middle + 1, high);
        } else if (arr[middle] > des) {
            return binarySearch(arr, des, low, middle - 1);
        } else {
            return middle;
        }
    }

    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 17};
        int des = 15;
        System.out.println("所查找元素在数组中的下标为:" + binarySearch(arr, des));
        System.out.println("所查找元素在数组中的下标为:" + binarySearch(arr, des, 0, 10));
    }
}

posted on 2017-07-30 16:29  cag2050  阅读(183)  评论(0编辑  收藏  举报

导航