90%以上的程序员无法正确无误的写出二分查找代码 , 原来我对这句话一直不以为然,认为二分查找没什么大的难度,但后来发现在一些二分查找的求解上,我经常由于边界条件或者等号问题,导致结果不正确或者死循环,而这些细节问题恰恰是求职面试中,面试官想要考察的点。
后来看到了知乎上一些人对二分查找的心得讨论https://www.zhihu.com/question/36132386,感觉自己之前对二分查找理解还不够深入。这其中有个比较重要的概念是“循环不变原理”,这个原理最早是在算法导论上的插入排序引入的,大致意思是这三点:
初始化:在循环的第一轮迭代前某个特性是正确的;
保持:如果在循环的某一次迭代开始之前某个特性是正确的,那么在下一次迭代开始之前,也是正确的;
终止:当循环结束,某个特性也是正确的。
这很像数学归纳法。下面举一个二分查找例子,查找一个有序数组中不超过值x的元素。写法可以有很多种