随笔 - 106  文章 - 2  评论 - 2017  阅读 - 43万 

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

1
2
3
4
5
6
7
8
9
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。

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

1
2
3
4
5
6
7
8
9
10
11
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,以及下一行与中间值的比较方式,你会发现其中的微妙 <( ̄︶ ̄)>

posted on   小城故事  阅读(1155)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示