先上源码
在做leetcode35搜索插入位置的时候,偶然间,我想起来了sort.SearchInts函数
于是我顺手点开了SearchInts的源码
出乎意料的,这个函数的代码只有一行
再次点进search函数的源码
可以看到
通过阅读发现
这是一个二分查找的模板,
传入的参数为 数组的长度n,以及,一个返回为bool的函数值
对0和n进行操作取得中间值h
为了防止溢出,在求平均值时使用无符号数uint得到双倍的最大表示数
之后,根据函数值的判定结果选择区间并再次进行二分查找,直至结束
这里巧用函数值作为参数,让所有需要使用二分查找模板的人都能调用这个模板,并重写适合自己的函数值f作为二分查找的判定条件
可见,函数值是go中一个奇妙的设计,对于函数值的详细介绍,可以看go圣经中的函数值部分https://books.studygolang.com...
于是,我们重新回到sort.SearchInts函数,
他的f判定条件为 切片的第i个数是否大于参数x
自然,二分查找的结果就是
在参数a这个切片中,寻找x这个数
切片中如果有这个数,则返回他的索引
如果找不到这个数,则返回第一个大于x的的数的索引
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。