最开始学数据结构的时候,就知道了二分查找,后来发现《编程之美》之类的名著上也都提到了这个算法。现在,觉得讲“二分查找”讲得最好的是《编程珠玑》。《编程珠玑》上是根据循环不变式来讲二分查找的,并给出了几种不同的形式。
最常见的二分查找
伪代码如下:
在A[low,…,high]中查找val
Binary-search(A, low, high, val)
While(low >= high)
Mid=(low+high)/2
If(A[mid] ==val)
break
Else if(A[mid] < val)
Low=mid+1
Else
High = mid-1
If(A[mid] == val)
returnmid
Else
Return -1
循环退出的条件,low,high和mid三个变量之间的关系,刚开始的时候的确会有点糊。循环不变式为我们提供了一个很好的理解方法。
该代码的循环不变式是:如果val在A中,那么它一定在A[low,…,high]中。
另一种二分查找
Binary-Search(A, low, high, val)
I = low-1
J = high
While(I + 1 != high)
Mid=(low+high)/2
If(A[mid] < val)
Low = mid
Else
High = mid
If(A[high] == val)
Return high
Else
Return -1
该算法的循环不变式为:如果val在A中,那么它一定满足:A[low-1]<val<=A[high]
第三种二分查找
Binary-Search(A, low, high, val)
I=low
J=high+1
While(i+1 != high)
Mid=(low+high)/2
If(A[mid] > val)
High = mid
Else
Low = mid+1
If(A[low] == val)
Return low
Else
Return -1
该算法的循环不变式为:如果val在A中,那么它一定满足:A[low]<=val<A[high]