二分查找的函数STL中

it2022-05-09  27

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。

ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于值val的位置。

lower_bound和upper_bound如下图所示:如果所有元素都小于val,则返回last的位置且last的位置是越界的!!~

 

2.插入:举例如下:

一个数组num序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,20,111。pos为要插入的位置的下标,则

pos=lower_bound(num,num+8,3)-num,pos=0。即num数组的下标为0的位置。

pos=lower_bound(num,num+8,9)-num,pos=1。即num数组的下标为1的位置(即10所在的位置)。

pos=lower_bound(num,num+8,111)-num,pos=8。即num数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。

pos=upper_bound(num,num+8,20)-num,pos=3。即num数组中的下标为3的位置。

1.lower_bound函数源代码:

 

view source print ? 01. //这个算法中,first是最终要返回的位置 02. int lower_bound(int *array, int size, int key) 03. { 04. int first = 0, middle; 05. int half, len; 06. len = size; 07.   08. while(len > 0) { 09. half = len >> 1; 10. middle = first + half; 11. if(array[middle] < key) {     12. first = middle + 1;          13. len = len-half-1;       //在右边子序列中查找 14. } 15. else 16. len = half;            //在左边子序列(包含middle)中查找 17. } 18. return first; 19. }

2.upper_bound函数源代码:

 

 

view source print ? 01. int upper_bound(int *array, int size, int key) 02. { 03. int len = size-1; 04. int half, middle; 05.   06. while(len > 0){ 07. half = len >> 1; 08. middle = first + half; 09. if(array[middle] > key)     //中位数大于key,在包含last的左半边序列中查找。 10. len = half; 11. else{ 12. first = middle + 1;    //中位数小于等于key,在右半边序列中查找。 13. len = len - half - 1; 14. } 15. } 16. return first; 17. }

转载于:https://www.cnblogs.com/flyljz/p/10991942.html


最新回复(0)