算法思想
- 对一个顺序存储的线性表,设立head、rear、min三个指针,mid=(head+rear)/2,对于奇数个数的表,mid刚好在中间位置,对于偶数个数的表,mid在length/2-1的位置。
- 因为有序的特性,假设为递增序列,那么当head<=rear的情况下(等号一定要取,否则可能出现目标元素在表头或者表尾但是循环就已经结束了)。
- 当L[mid]>Target,说明目标在中间元素左边,令rear=mid-1;
- 当L[mid]<Target,说明目标在中间元素右边,令head=mid+1;
- 当head>rear时,说明查找结束。
代码
Position BinarySearch( List L, ElementType X ){
int head=1;//表下标为1~n
int rear=L->Last;//指向表尾下标
int mid;
while(head<=rear){
mid=(head+rear)/2;
if(L->Data[mid]>X)
rear=mid-1;
else if(L->Data[mid]<X)
head=mid+1;
else {
return mid;
break;
}
}
return NotFound;
}
复杂度分析
第一次折半范围:n
第二次折半范围:n/21
第三次折半范围:n/22
…
第k次折半范围:n/2k
k即为循环次数,因为折半到最后,即最差的情况下,为1个元素(首或者尾),所以令n/2k=1,得到k=log2n。
即时间复杂度T(n)= O(log2n)。