zoukankan      html  css  js  c++  java
  • 最优雅的二分查找

    今天复习以前的代码,突然发现插入排序用的二分查找算法实现得很别扭,于是试试重写一个,没想到相当顺利,几分钟就写好并测试通过了:

    static int BinarySearch(int[] array, int value, int start, int end) 
    { 
        if(start == end) return start; 
        var middle =  (start + end)/2 + 1; 
        if(value >= array[middle]) 
            return BinarySearch(array, value, middle, end); 
        else 
            return BinarySearch(array, value, start, middle - 1); 
    }
    

    要说明一下,这是用查找升序数组的,结果是小于等于value(被查找值)的最后一个元素的位置。比如说序列{1,3,5,5,7,9},查找5,返回3;查找6,也返回3;查找8,则返回4。

    这样非常方便与其他算法合作,比入插入排序,不容易出现索引溢出错误。下面是非递归版本:

    static int BinarySearch2(int[] array, int value, int start, int end) 
    { 
        while (true) { 
            if(start == end) return end; 
            var middle = (start + end)/2 + 1; 
            if(value >= array[middle]) 
                start = middle; 
            else 
                end = middle - 1; 
        } 
    }
    

    据我所知,这恐怕是最精简最优雅的实现了,如果有更好的,欢迎来指导。至于降序数组的情况该怎么写,请注意计算中间值位置middle,以及下一行与中间值的比较方式,你会发现其中的微妙 <( ̄︶ ̄)>

  • 相关阅读:
    yaml 文件解析
    python 实现自动部署测试环境
    运行ride.py报错,闪退
    selenium 配置ie11 浏览器
    自动化测试(1)selenium+python+chrome 连接测试
    scrapy爬虫框架
    drf内置排序源码
    celery基本使用
    C# 如何复制(拷贝)Label控件上的文本【新方法】
    C# 使用PictureBox实现图片按钮控件
  • 原文地址:https://www.cnblogs.com/XmNotes/p/4355891.html
Copyright © 2011-2022 走看看