你真的会二分查找吗

二分查找经常写挂,最常写挂的就是陷入一个死循环,如何避免呢?

网上有很多版本的二分代码。循环条件有:l < r的,有l+1 < r的,有l <= r的。做个总结吧。

一、首先是二分查找一个值,找到返回其下标,否则返回-1。

//在a[l] ~ a[r]中查找s
int binary_search(int l, int r, int s){
    while(l <= r){
        int m = (l+r)/2;
        if(a[m] == s) return m;
        if(a[m] < s) l = m+1;
        else r = m-1;
    }
    return -1;
}

二、查找边界值

有序数组中找到“正好大于(小于)目标数”的那个数。

如果找不到怎么办呢?要返回什么值?

我们这里规定,如果找大于(等于)某个值的数找不到,返回最后一个值的下一个坐标;

//a[l] ~ a[r-1]中查找,如果不存在,则返回坐标r
int binary_search(int l, int r, int s){
    while(l < r){
        int m = l+(r-l)/2;
        if(a[m] > s) r = m;
        else l = m+1;
    }
    return l;
}

如果找小于(等于)某个值的数找不到,返回第一个值的前一个坐标。

//a[l+1] ~ a[r]中查找,如果不存在,则返回坐标l
int binary_search(int l, int r, int s){
    while(l < r){
        int m = l+(r-l+1)/2;
        if(a[m] < s) l = m;
        else r = m-1;
    }
    return l;
}

总结一下,[l, r]就是所有可能的返回情况。还有就是注意m的取值,用+1调节偏左还是偏右,避免死循环。

为什么不用(l+r)/2呢....因为l+r是负数的时候他偏左或偏右和正数的时候就不一样了。

时间: 2024-10-03 13:45:20

你真的会二分查找吗的相关文章

(转载)你真的会二分查找吗?

原文地址 :http://blog.csdn.net/int64ago/article/details/7425727 看到这个标题无论你是处于怎样的心理进来看了,我觉得都是值得的.因为这个问题太简单,任何一个开始接触“真正”算法基本都是从二分查找开始的.至于二分查找都不知道是什么的可以先去找别的资料看下,再来看这篇文章.既然很简单,那么我们开始一起写一个吧,要求是对num[]={1,2,2,4,4,8,10}不减序列在区间[0,7)进行查找,当然我们得首先保证要查找的数e满足:num[0] <

【转】你真的会二分查找吗?

转自:http://blog.csdn.net/int64ago/article/details/7425727 红色字体为我对此转载文章的批注 看到这个标题无论你是处于怎样的心理进来看了,我觉得都是值得的.因为这个问题太简单,任何一个开始接触"真正"算法基本都是从二分查找开始的.至于二分查找都不知道是什么的可以先去找别的资料看下,再来看这篇文章.既然很简单,那么我们开始一起写一个吧,要求是对num[]={1,2,2,4,4,8,10}不减序列在区间[0,7)进行查找,当然我们得首先保

"二分查找(Binary Search)"与"斐波那契查找(Fibonacci Search)"

首先,我们来看一个笔者的拙作,一段二分查找代码 //返回值是key的下标,如果A中不存在key则返回-1 template <class T> int BinSearch(T* A, const T &key, int lo, int hi) {     int mid;     while(lo<hi)     {         mid = lo + (hi-lo)/2;         if(key < A[mid])             hi = mid-1;

算法实现回顾1——二分查找

前话: 为什么写这个系列?算法的精髓除了在于算法的一个设计,更在于算法的一个好的设计.前者可能需求一个好的算法工程师,而后者则需求一个优秀的程序员.很多时候我们往往只希望去了解一种设计思路,但是对于程序员,一种优良的实现是非常重要的.实现的细节才决定成败.毕竟程序员面对和输出的都是程序,而不是思路. 引用: 你真的会二分查找吗?http://blog.csdn.net/int64ago/article/details/7425727二分查找,你真的会吗?http://www.ahathinkin

K-th Number 线段树(归并树)+二分查找

K-th Number 题意:给定一个包含n个不同数的数列a1, a2, ..., an 和m个三元组表示的查询.对于每个查询(i, j, k), 输出ai, ai+1, ... ,aj的升序排列中第k个数 . 题解:用线段树,每个节点维护一个区间并且保证内部升序,对于每次查询x,返回该区间小于x的数的个数.就这样不断二分,直到找到x为止. 线段树(归并树)+二分查找 1 #include <iostream> 2 #include <cstdio> 3 #include <

【转】STL之二分查找 (Binary search in STL)

Section I正确区分不同的查找算法count,find,binary_search,lower_bound,upper_bound,equal_range 本文是对Effective STL第45条的一个总结,阐述了各种查找算法的异同以及使用他们的时机. 首先可供查找的算法大致有count,find,binary_search,lower_bound,upper_bound,equal_range.带有判别式的如count_if,find_if或者binary_search的派别式版本,其

【优化王牌】二分查找

二分查找    二分法?多简单?NO!NO!NO!我们可不是讲俗透顶的二分查找!我们讲的是二分查找的应用!      我们讲的也不是二分答案,是优化.      你真的会充分地用二分查找吗?      事实告诉你:含序列题目并可以暴力等求出答案的,基本上二分查找都是可以将其优化的!      不信?咱们来看看一道简单的排序: MZA 的排序 [问题描述]   现在知道 MZA 有一堆同学,也不知道有多少个. 可恶的 MZA 现在给了你这堆同学的名字和成绩(都是英文名字),请你输出他们的成绩排序.

数据结构与算法实践 之 二分查找初识

今天起,我要对数据结构和基本的算法进行一些简单的复习,并在复习的基础上对其进行深入的挖掘.这篇文章先对二分查找进行一个简要的复习,在之后的文章中会对其进行深入的学习. 二分查找又叫折半查找,是最基本的几种查找算法之一.简单的看,二分法查找主要应用于在一个有序数列中进行元素的查找,其基本思路是,先用我们要查找的元素与这个有序数列中的中间位置的元素进行比较(在此我们姑且称这个元素为"中间位置元素"吧,至于这个元素怎么求我在后面会详细说明),如果相等,则返回这个"中间位置元素&qu

BZOJ_3343_教主的魔法_分块+二分查找

题意:教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列被编号为1.2.--.N.每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高)询问WD闭区间 [L, R] 内有多少英雄身高大于等于C,以验证教主的魔法是否真的有效. 分析:暴力! 每一