您的位置:首页 > 其它

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

2013-08-08 13:56 309 查看

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐