关于二分查找的思考

算法思想

  • 对一个顺序存储的线性表,设立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)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值