在排序数组中查找特定条件数值的程序总结

int find(int b, int e,int value)


1.在数组num的下标范围b,e,查找num[i]<= value 的最大i

int findpm(int b,int e,int value){
	int id = b-1;//Attention
	int mid;
	while(b<=e){ //ATTENTION  <=
		mid = (b+e)>>1;
		if(num[mid]<=value){
			id = mid;
			b = mid+1;
		}else{
			e = mid-1;
		}
	}
	return id;
}

     关键部分在于
		if(num[mid]<=value){
			id = mid;
			b = mid+1;
      while(b<=e)的终止条件要有=,因为id标记的是num[mid]<=value的mid,随着mid的往右不断移动来得到满足条件的id,考虑这个情况:
     num[b]=value,  j>b时,num[j]>num[b], 如果 while(b<e)来终结的话,在循环中num[mid]一直大于value,直到b==e终止,返回id = b-1.显然错啦。
     用while(b<=e)来终止的话,循环到b==e时,
          mid = (b+e)>>1   
   =>  mid == b  
   =>  num[mid]==value  
   =>  id = mid 
   =>  b = mid+1;
   =>  b>e
   终止循环,返回id = b;
 
        这样的程序对于不同情况的结果

        1)value  < num[b]   

              也就是num数组从b到e范围内不存在<=value的元素,返回b-1;

         2)  num数组从b到e范围内存在多个比value小的元素,不存在等于value的元素

              返回比value小的最大的num[id]

         3)  num数组从b到e范围内存在多个等于value的元素

              返回等于value的最大的num[id]


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值