go源码阅读——sort.SearchInts与Search

先上源码
go源码阅读——sort.SearchInts与Search_第1张图片
在做leetcode35搜索插入位置的时候,偶然间,我想起来了sort.SearchInts函数

于是我顺手点开了SearchInts的源码

出乎意料的,这个函数的代码只有一行

再次点进search函数的源码

可以看到

go源码阅读——sort.SearchInts与Search_第2张图片

通过阅读发现

这是一个二分查找的模板,

传入的参数为 数组的长度n,以及,一个返回为bool的函数值

对0和n进行操作取得中间值h
为了防止溢出,在求平均值时使用无符号数uint得到双倍的最大表示数

之后,根据函数值的判定结果选择区间并再次进行二分查找,直至结束

这里巧用函数值作为参数,让所有需要使用二分查找模板的人都能调用这个模板,并重写适合自己的函数值f作为二分查找的判定条件

可见,函数值是go中一个奇妙的设计,对于函数值的详细介绍,可以看go圣经中的函数值部分https://books.studygolang.com...

于是,我们重新回到sort.SearchInts函数,
go源码阅读——sort.SearchInts与Search_第3张图片
他的f判定条件为 切片的第i个数是否大于参数x
自然,二分查找的结果就是
在参数a这个切片中,寻找x这个数
切片中如果有这个数,则返回他的索引
如果找不到这个数,则返回第一个大于x的的数的索引

你可能感兴趣的:(go源码学习二分查找)