lower_bound(int A*,int l,int r,int val);
对于有序数组求职为val的元素插入位置,第一个出现该元素的位置.
分析:
等待插入的元素是val,有序数列是A[](此处按照升序排列),寻找的范围是[l,r];
如果查找区间只存在一个元素 l==r;时.
只需要判断val>A[l]时返回插入下标是l+1:
否则val<=A[l]返回的下表是l(因为要找的插入位置,小于或者相等都会插入到查找位置)
否则如果存在l<r;(l>r为不合法的情况,或者如果l>r时交换l和r)
可以取中点m=(l+r)/2;
比较A[m],与val的值的大小.
如果:
1.val>A[m];则如果A[]中存在val,那么一定是在右边,因此令l=m+1;
2.val<A[m];则如果A[]中存在val, 那么一定是在左边,因此令r=m-1;
3.val=A[m];则如果A[]在m之前存在val,那么一定是在左边此时边界保留,或者不保留,令r=m;或者r=m-1(选择较好的m-1)
可以将二三合并为普遍情况r=m; (如果r=m-1没查到结果会出现到m处查到的情况,因此可以做这样的归并)
如果l<r 任意的m=(l+r)/2   <  (r+r)/2即为r,任意计算出的r'<r;
如果l<r 任意的m=(l+r)/2 + 1  > (l+l)/2 + 1 (即为l+1) l'>l;

对于任意区间范围内l<r;是区间都在缩小,不会出现死循环直到l==r;(此时问题可解) ;

一次算法描述可以是

int lower_bound(int *A,int L,int R,int val){int l=L,r=R;while(l<r){ int m=(l+r)/2;if(val<=A[m]){r=m-1;}else{l=m+1;}}return val<=A[l]?l:l+1;
}

以一个例子说明
A[1]={1};
此时有l==r;
查找大值2;
由于2>A[(0+1)/2];
因此插入位置l+1,即为1;
查找相同值1;
插入位置是l,即为0.
查找小值0:
插入位置是0,即为0.

如果l<r
A[5]={1,2,2,2,2};
此时查找2 (r=m)
第i次查找
i= 1  2  3  4  
l= 0  0  0  1
r= 4  2  1  1
m= 2  1  0  退出循环返回l,即为1.
如果零r=m-1;
l= 0  0  1
r= 4  1  1
m= 2  0  退出循环返回1
因此可以看出将情况A[m]=val,将r=m-1,效率更高O(log2n);

upper_bound思想同理

描述可以是

int upper_bound(int *A,int L,int R,int val){int l=L,r=R;while(l<r){int m=(l+r)/2;if(val>=A[m]){l=m+1;}elser=m-1;}return val>=A[r]?r+1:r;
}
int main(){int a[10]={1,2,2,2,2,2,2,4,5,6};printf("%d\n",lower_bound(a,0,9,2));printf("%d\n",upper_bound(a,0,9,2));return 0;
} 

执行结果

c语言实现lower_bound和upper_bound相关推荐

  1. upperbound找不到_关于lower_bound( )和upper_bound( )的常见用法

    头文件:#include lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的. 在从小到大的排序数组中, lower_bound( begi ...

  2. C++ STL: lower_bound 和 upper_bound

    接口声明 以下有两个不同的版本 lower_bound template <class ForwardIterator, class T>ForwardIterator lower_bou ...

  3. 【ACM】Uva 1152 (4 Values whose Sum is 0) 二分查找lower_bound() 和upper_bound()的使用

    [问题描述] The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, ...

  4. vector的插入、lower_bound、upper_bound、equal_range实例

    对于这几个函数的一些实例以便于理解: #include <cstdlib> #include <cstdio> #include <cstring> #includ ...

  5. lower_bound和 upper_bound 用法(STL)

    lower_bound和 upper_bound的头文件是#include<algorithm> lower_bound 返回第一个大于等于 x 的数的地址/迭代器 upper_bound ...

  6. lower_bound和upper_bound算法

    STL中的每个算法都非常精妙,接下来的几天我想集中学习一下STL中的算法. ForwardIter lower_bound(ForwardIter first, ForwardIter last,co ...

  7. STL中的lower_bound和upper_bound的理解

    STL迭代器表述范围的时候,习惯用[a, b),所以lower_bound表示的是第一个不小于给定元素的位置 upper_bound表示的是第一个大于给定元素的位置. 譬如,值val在容器内的时候,从 ...

  8. 二分检索函数lower_bound()和upper_bound()

    二分检索函数lower_bound()和upper_bound() 一.说明 头文件:<algorithm> 二分检索函数lower_bound()和upper_bound() lower ...

  9. lower_bound()和upper_bound()

    二分检索函数lower_bound()和upper_bound() lower_bound():找到大于等于某值的第一次出现 upper_bound():找到大于某值的第一次出现 必须从小到大排序后才 ...

最新文章

  1. SAP QM 由于存在未清TO单导致QA11失败
  2. 【转】Android studio安装与配置
  3. Leetcode-997 Find the Town Judge(找到小镇的法官)
  4. Android Weekly Notes Issue #220
  5. 每天20分钟,只需一年,一年级学生英语听力达到六年级水平!关键是坚持一点都不难!
  6. 进度条ProgressBar及ProgressDialog
  7. ivx中字体显示_Windows 7 中的 SimSun-ExtB 是什么字体,为何与中易宋体 SimSun 显示出来不一样?...
  8. 开漏输出和推挽输出的区别?
  9. VC++ 应用程序无法正常启动0xc0150002
  10. web网络安全防护方案
  11. 金蝶KIS商贸高级版V6.1开发实现‘序时簿中心’增加'联系人'字段列
  12. Cheat Enginee(CE)的详细使用指南~包含下载安装教程以及核心功能讲解
  13. 蚂蚁金服旗下网商银行招聘了
  14. [附源码]Nodejs计算机毕业设计我的大学电子相册Express(程序+LW)
  15. Ubuntu下最便捷好用微信、QQ(Wine-Tim Wine-QQ )没有之一
  16. 电子科技大学--大数据论坛--相关资料
  17. Muli3D 3 qQuaternionRotationMatrix 函数 (矩阵转四元数)
  18. 何学林:房价为什么降不下来?房价上涨的刚性是由强大的利益共同体共同作用的结果(原创首发,深度好文)——何学林房地产大策划之十四
  19. 微信交电费访问服务器失败,微信怎么交电费?操作步骤,常见问题说明
  20. 企业费控,驶向「一体化」

热门文章

  1. SpringMVC---(2)
  2. Win7(Win2003)下安装Node.js(版本号:v0.11.0)提供下载
  3. Kaggle: Jigsaw Multilingual Toxic Comment Classification Top Solutions 金牌思路总结
  4. 投稿时Cover Letter的重要性(部分体会来自导师)
  5. 让Fedora 19支持ThinkPad鼠标中键和小红点实现滚轮效果
  6. 二手车好大风,老平台都推新服务
  7. 重庆大学计算机学院最好老师,“一切都是最好的安排”——蒲俊杰老师喜获重庆大学“最受学生欢迎老师”称号...
  8. 记一次服务器被木马注入攻击
  9. 【修改el-menu主菜单和子菜单悬浮的背景色】
  10. VOC2012数据集百度云链接