折半查找(快速定位)

下面要讲述的是两种用到折半查找的定位需求

定位一

tips: 辅助快速插入,找到某个数对应的插入位置。

细节描述:在一个有序数组list中,插入一个数num.

插入一个num,先要找到插入的位置,一般情况下折半查找的速度是最快的。

在list数组中,需要找到一个位置 i,满足
( l i s t [ i − 1 ] < = n u m ) & & ( l i s t [ i ] > n u m ) (list[i-1]<=num )\&\& (list[i]>num) (list[i1]<=num)&&(list[i]>num)
i就是num要插入的位置即插入完成后
l i s t [ i ] = = n u m list[i]==num list[i]==num

 public int findInsertLoc(List<Integer> a, int n)
 {
     int l=-1,r=a.size();
     while(l<r-1)
     {
         int mid = (l+r)>>1;
         int v = a.get(mid);
         if(v<n)
             l=mid;
         else if(v>n)
             r=mid;
         else
         {
             l=mid;
             r=l;
         }
     }
     /*循环结束以后
     *如果n小于a中所有的数 l=-1;
     *如果n大于a中所有的数 l=a.size()-1;
     *其他情况都满足 a.get(l)<=n && a.get(l+1)>n
     *最后 l+1的位置就是n要插入的位置
     */
     return l+1;
 }

定位二

细节描述:查找顺序数组list中元素e的位置,若不存在返回-1;

想法:在上一种定位的描述中可以知道位置i,是一个特殊的位置,满足
( l i s t [ i − 1 ] < = n u m ) & & ( l i s t [ i ] > n u m ) (list[i-1]<=num )\&\& (list[i]>num) (list[i1]<=num)&&(list[i]>num)
所以要找到e的位置只要通过findInsertLoc()方法找到位置i,且
( i ! = 0 ) & & ( l i s t [ i − 1 ] = = e ) (i!=0)\&\&(list[i-1]==e) (i!=0)&&(list[i1]==e)
e在list中的位置就是i-1.

否则e就不在list中.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值