写出正确的二分搜索知易行难,原理好像都懂,但是实际上手就出各种错误,例如如何确定循环终止条件、区间搜小判断条件等。这里就手把手教你写出正确的二分检索!
二分法共有下面7种变式。
①是否存在数字t ——返回下标或者-1
②找到大于t的第一个数 ——返回下标或者-1
③找到大于等于t的第一个数 ——返回下标或者-1
④找到小于t的最后一个数 ——返回下标或者-1
⑤找到小于等于t的最后一个数 ——返回下标或者-1
⑥是否存在数字t,返回 第一个t ——返回下标或者-1
⑦是否存在数字t,返回 最后一个t ——返回下标或者-1
首先说一点个人思考,情况1(查找target位置)完全就是抖了个机灵,用情况1来当作二分查找的基本情况是非常非常错误的,从情况1完全不能推导出其他情况下二分查找该如何写。看了很多篇博客,没有一篇兼顾了正确性证明和归纳性。下面是我阅读过《Elements of programming》了解二分法原理后,自己扩展出的二分法各种变式。每一种情况都有正确性证明,且条件归纳统一,归纳性强,很好理解。