算法

二分查找

2017-09-22  本文已影响0人  Mayo酱

如果一个数组是无序的,那么可以通过简单遍历查找的方式查找到某个元素所在的角标。但是如果一个数组 是有序的,那么就可以通过一种更高效的方式达到相同的目的,也就是二分查找。

思路:

1、设置三个变量记录角标:min、max、mid。min初始值为0,max为数组最大角标,mid为 (max+min)/2。

2、查看mid角标的元素是否与待查找的值相等,如果相等,则直接返回角标值,程序终止执行。

3、如果待查找的值小于角标为mid的元素值,那么说明待查找的元素的位置可能在min与mid角标之间。设 置max = mid - 1,mid = (max + min)/2,重复第1、2步的操作。

4、如果待查找的值大于角标为mid的元素值,那么说明待查找的元素的位置可能在mid与max角标之间。设 置min = mid + 1,mid = (max + min)/2,重复第1、2步的操作。

5、如果数组中不存在待查找的元素,那么按照如上流程,最终min角标值会大于max角标值,此时返回-1。

public static int binarySearch(Integer[] srcArray, int des) {
    //定义初始最小、最大索引
    int low = 0;
    int high = srcArray.length - 1;
    //确保不会出现重复查找,越界
    while ((low <= high) && (low <= srcArray.length - 1)
            && (high <= srcArray.length - 1)) {
        //计算出中间索引值
        int middle = (high + low)/2 ;
        if (des == srcArray[middle]) {
            return middle;
        //判断下限
        } else if (des < srcArray[middle]) {
            high = middle - 1;
        //判断上限
        } else {
            low = middle + 1;
        }
    }
    //若没有,则返回-1
    return -1;
}
上一篇下一篇

猜你喜欢

热点阅读