STL функция двоичного поиска

ForwardIter lower_bound (ForwardIter первый, последний, Const ForwardIter _Tp & Val) Алгоритм возвращает неубывающая последовательность [первый, последний) не меньше, чем положение валь первое значение.

ForwardIter upper_bound (ForwardIter первый, последний, Const ForwardIter _Tp & Val) Алгоритм возвращает неубывающая последовательность [первый, последний) в первом положении, которое больше, чем значение Валу.

LOWER_BOUND и UPPER_BOUND показано ниже: Если все элементы меньше Валу, возвращает последнюю позицию и последняя позиция находится вне диапазона! ! ~

 

2. Вставка: например, следующим образом:

Массив последовательность Num: Для того, чтобы вставить номер 3,9,20,111 4,10,11,30,69,70,96,100 предусмотрено. Положение поз должны быть вставлено в соответствии со стандартом, то

lower_bound = POS ( NUM , Num + 8,3) - NUM , POS = 0. Т.е. Num индекс массива 0 позиций.

поз = lower_bound (Num, Num + 8,9) -число, пос = 1. Т.е. Num массив позиции индекс 1 (то есть находятся в положении 10).

поз = lower_bound (Num, Num + 8111) -число, пос = 8. Т.е. Num индекс массива находится в положении 8 (нижний индекс, но верхний предел равен 7, так что следующий элемент возвращает последний элемент).

поз = upper_bound (Num, Num + 8,20) -число, пос = 3. Т.е. Num индекс массива 3 позиции.

1.lower_bound источник кода функции:

 

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 источник кода функции:

 

 

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. }

рекомендация

отwww.cnblogs.com/flyljz/p/10991942.html