数据结构--二分查找法

二分查找法 (Binary Search)

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

示例(Java)

递归逻辑

   public static <E extends Comparable<E>> int search(E[] data, E target){
        return search(data, 0, data.length - 1, target);
    }

    //递归
    private static  <E extends Comparable<E>> int search(E[] data, int l, int r, E target) {
        if( l > r) return  -1;
        int mid = l + (r - l)/2;
        if (data[mid].compareTo(target) > 0)
            return search(data, l, mid, target);
        if(data[mid].compareTo(target) < 0)
            return search(data, mid + 1, r, target);
        return mid;
    }

非递归逻辑

    public static <E extends Comparable<E>> int search2(E[] data, E target) {
        int l = 0, r = data.length - 1;
        while (l <= r) {
            int mid = l + (r - l)/2;
            if (data[mid].compareTo(target) == 0)
                return mid;
            if (data[mid].compareTo(target) < 0)
                l = mid + 1;
            else
                r = mid - 1;
        }
        return -1;
    }
Binary Search

时间复杂度:

时间复杂度(不算排序):O(logn)

相关变种问题

    // >target 的最小值的索引
    public static <E extends Comparable<E>> int upper(E[] data, E targt){
        // r = data.length 表示>target的值在数组最后一个元素的后面 数组中的所有元素都<target
        int l = 0, r = data.length;
        while (l< r) {
            int mid = l + (r- l)/2;
            if (data[mid].compareTo(targt) <= 0)
                l = mid + 1;
            else
                r = mid;
        }
        return l;
    }

    // >= target 的最小索引
    public static <E extends Comparable<E>> int lowerCeil(E[] data, E target){
        int l = 0, r = data.length;
        while (l < r) {
            int mid = l + (r - l)/2;
            if (data[mid].compareTo(target) < 0)
                l = mid + 1;
            else
                r = mid;
        }
        return l;
    }

    // > target, 返回最小索引
    // = target, 返回最大索引
    public static <E extends Comparable<E>> int upperCeil(E[] data, E targt){
        int u = upper(data,targt);
        if (u - 1 >= 0 && data[u - 1].compareTo(targt) == 0)
            return u - 1;
        return  u;
    }

    // <target 的最大值的索引
    public static <E extends Comparable<E>> int lower(E[] data, E target){
        int l = -1, r = data.length - 1;
        //当l与r相邻时 eg:0, 1 是 mid由于计算机下取整 mid = l + (r - l)/2 = 0, 所以l = 0 引起死循环。
        //解决办法: mid = l + (r - l + 1)/2 采用上取整
        while (l < r) {
            int mid = l + (r - l + 1)/2;
            if (data[mid].compareTo(target) >= 0)
                r = mid - 1;
            else
                l = mid;
        }
        return l;
    }

    // <= target 的最大索引
    public static <E extends Comparable<E>> int upperFloor(E[] data, E target){
        int l = -1, r = data.length - 1;
        //当l与r相邻时 eg:0, 1 是 mid由于计算机下取整 mid = l + (r - l)/2 = 0, 所以l = 0 引起死循环。
        //解决办法: mid = l + (r - l + 1)/2 采用上取整
        while (l < r) {
            int mid = l + (r - l + 1)/2;
            if (data[mid].compareTo(target) > 0)
                r = mid - 1;
            else
                l = mid;
        }
        return l;
    }

    // < target 的最大索引
    // = target 的最小索引
    public static <E extends Comparable<E>> int lowerFloor(E[] data, E target){
        int l = lower(data, target);
        if (l + 1 <  data.length && data[l + 1].compareTo(target) == 0)
            return l + 1;
        return  l;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容