码迷,mamicode.com
首页 > 编程语言 > 详细

【算法模板】Binary Search 二分查找

时间:2017-05-07 13:58:33      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:amp   nbsp   binary   程序   ret   范围   大于   相交   排序   

模板:

  给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1

int binarySearch(vector<int> &array, int target) {
        if (array.size() == 0) {
            return -1;
        }
        
        int start = 0;
        int end = array.size() - 1;
        int mid;
        
        while (start + 1 < end) {
            mid = start + (end - start) / 2;
            if (array[mid] >= target) {
                end = mid;
            } else {
                start = mid;
            }
        }
        
        if (array[start] == target) {
            return start;
        }
        if (array[end] == target) {
            return end;
        }
        
        return -1;
    }

  若将条件改为查找target最后一次出现的下标(从0开始),那么程序将发生改变,循环中如果 array[mid] = target, 则 start = mid; 且最后的边界判断改为先判断

array[end] == target; 其他不变。

int binarySearch(vector<int> &array, int target) {
        if (array.size() == 0) {
            return -1;
        }
        
        int start = 0;
        int end = array.size() - 1;
        int mid;
        
        while (start + 1 < end) {
            mid = start + (end - start) / 2;
            if (array[mid] <= target) {
                start = mid;
            } else {
                end = mid;
            }
        }
        
        if (array[end] == target) {
            return end;
        }
        if (array[start] == target) {
            return start;
        }
        
        return -1;
    }

 

解析:

  已排序很重要,而且排序是降序还是升序写法也不一样。

  写程序先写异常处理,这里对应的是数组为空的情况。

  start 和 end 分别初始化为 0 和 array.size() - 1。

  取中值使用 mid = start + (end - start) / 2; 目的是为了防止 start + end 的值超出int范围发生溢出错误。

  循环停止条件为 start < end-1;没有等号,如果取等号,那么有可能进入死循环,如:start = 1; end = 2; 那么 mid = 1;那么此时如果令 start = mid,程序将进入死循环。

  循环停止时肯定有 start + 1 == end;或者数组元素只有一个,也就是说 start 和 end 要么相邻(数组元素个数大于1),要么相交(数组元素个数为1),那么都可以归结为最后的判断语句,根据题目的要求(第一次出现还是最后一次出现)确定判断顺序。  

【算法模板】Binary Search 二分查找

标签:amp   nbsp   binary   程序   ret   范围   大于   相交   排序   

原文地址:http://www.cnblogs.com/Atanisi/p/6820537.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!