看似简单的二分,真正用起来还是有很多不容易的地方的,所以说,有说99%的程序员写的二分通常是错的。因为我们可能要在有序队列中找小于、小于等于、大于、大于等于这些情况。往往我们很容易搞晕。我的一个朋友notsure很深入的研究过各种情况,我这里借用他的二分的写法,如果你认同这种写法对你来说容易理解,可以在理解的基础上硬记住。
按照其写法,假设非降队列是a[],查找关键字为key,无论上面四种情况中的任何一种,二分后都有这种性质:a[high]<=key<=a[low]。
大框架必定是:
1.关键字小于key的元素的位置:
因为要找小于key的元素,根据性质,毫无疑问肯定是high了,然后我们来看条件a[mid]<key,假设当前位置a[mid]=key,那么将执行high=mid-1,也就是说high还得往小的地方走,要找个更加小的,所以最后是比key还小。
2.关键字小于等于key的元素的位置:
结果仍然是high,但是条件a[mid]<=key,等于的时候移动的是low,high不动,所以结果最后是小于等于key。
3.关键字大于key的元素的位置:
根据性质结果是low,但是这里要注意了,看条件a[mid]<=key,为什么呢?还是看a[mid]=key的情况,相等的时候low还是往大处走,所以最后会大于key。
4.关键字大于等于key的元素的位置:
条件a[mid]<key,当a[mid]=key的时候,low不动,所以最后low大于等于key。
总结:
硬记大框架,小的是high,大的是low,判断条件主要看a[mid]=key的时候决定结果的high或者low是否变,变了那么最后不可能和key相等,那么是小于或者大于,没变还是有可能相等,所以是小于等于或者大于等于。