二、二分查找算法

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

  查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

  例1:判断某数组是否存在某个值?
普通的作法就是暴力破解,for循环一个一个看,运气好一次出结果,运气不好嘛,数组有多长就得来多少次。
  下面开始使用二分查找,上代码:

/**
     * 判断数组arr中是否存在key,存在则返回index,否则返回-1
     *
     * @param key 值
     * @param arr 数组 必须是从小到大排列,这是使用二分查找的基础
     * @return
     */
    public static int indexOf(int key, int[] arr) { // 数组必须是有序的
        int begin = 0;//查找起始位置
        int end = arr.length - 1;//查找末尾位置
        int count = 0;//计数器,统计查了多少次
        while (begin <= end) { // 被查找的键要么不存在,要么必然存在于 arr[begin..end] 之中
            count++;//没查一次计数器+1
            int mid = begin + (end - begin) / 2;
            if (key < arr[mid]) {
                end = mid - 1;
            } else if (key > arr[mid]) {
                begin = mid + 1;
            } else {
                System.out.println("共计查询了" + count + "次");//得出结论之前打印一下遍历次数
                return mid;
            }
        }
        System.out.println("共计查询了" + count + "次");
        return -1;
    }

    public static void main(String[] args) {

        int[] arr = {0, 2, 4, 5, 6, 7, 9, 10, 12, 14, 16, 17, 18, 19, 21, 28, 39, 41, 43, 44, 49, 51, 53, 54, 55, 60, 62, 65, 69, 79};//一个长度为30的数组
        System.out.println(indexOf(79, arr));

    }

运行程序后输出: 共计查询了5次  查找后返回的值为29

  数组越长,二分查找的优势会越明显。


  本系列所有的代码都会在github同步更新,立刻前往

你可能感兴趣的:(二、二分查找算法)