Модуль: Бинарный (двоичный) поиск


1. Двоичный поиск в упорядоченном массиве: начало (С++)

☰ Теория

Двоичный поиск является эффективным алгоритмом — его оценка сложности O(log2(n)), в то время, как у обычного последовательного поиска O(n). Это значит, что, например, для массива из 1024 элементов, линейный поиск, в худшем случае, когда искомого элемента нет в массиве, обработает все 1024 элемента. Бинарным поиском достаточно обработать \(log_2(1024) = 10\) элементов. Такой результат достигается за счет того, что после первого шага цикла область поиска сужается до 512 элементов, после второго – до 256 и т.д.

Недостатками такого алгоритма является требование упорядоченности данных, а также возможность доступа к любому элементу данных за постоянное (не зависящее от количества данных) время. Таким образом, алгоритм не может работать на неупорядоченных массивах и любых структурах данных, построенных на базе связных списков.


Реализация
пока (right – left > 1) // Пока правая граница правее левой
нц
  middle = (left + right) / 2; // Середина области поиска
  если (A[middle] >= b), то
    right = middle; // Передвигаем правую границу
  иначе
    left = middle; // Иначе передвигаем левую границу
кц
если (A[right] == X), то
  вывод right;
иначе
  вывод -1;

где:
А - исходный массив,
N - размер массива,
X - искомое число.
 

Реализуйте алгоритм бинарного поиска.
 
Формат входных данных
В первой строке входных данных содержатся натуральные числа N и K (\(0<N <= 100000,\ 0<K<=10^9\) ). Во второй строке задаются N элементов массива, отсортированного по возрастанию. Элементы массива - целые числа, каждое из которых по модулю не превосходит 109.
 
Формат выходных данных
Требуется для K вывести в отдельную строку его номер в массиве, если это число встречается в массиве, и "NO" в противном случае.
 
Примеры
Входные данные Выходные данные
1
10 5
1 2 3 4 5 6 7 8 9 10 
5

Вставьте недостающие фрагменты кода
C++
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;

int Search_Binary (vector<int> arr, int key)
{
	int  midd = 0, left =-1, right = arr.size();    
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, w, h, l, r, k, index;

	cin >> n >> k;

	vector<int> A(n);

	for (int i = 0; i < n; i++) {
                cin >> A[i];
	}

    index = Search_Binary (A, k);
 
	if (index >= 0) 
		cout << index+1 << endl;
	else
		cout << "NO" << endl;

    return 0;
}