Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <time.h>
- using namespace std;
- bool binarySearch(vector <int> v, int a) //Функция бинарного поиска
- {
- int kd(0), l(0), r(v.size() - 1); //kd - счётчик действий, l - левая граница поиска, r - правая
- sort(v.begin(), v.end()); //Сортируем массив, так как бинарный поиск работает только в отсортированной последовательности
- //Здесь мы не считаем кол-во действий, но про них стоит сказать, ведь сортировка занимает O(nlogn) действий,
- //где n - размер массива. sort() работает на основе быстрой сортировки
- while (l < r)//стандартный алгоритм бинарного поиска
- {
- kd++; // каждый раз прибавляем количество действий, так как на каждой итерации производим одно сравнение
- int m = (l + r) / 2; //каждый раз выбираем новую середину
- if (v[m] == a) // если середина равна искомому числу, говорим, что число найдено
- {
- cout << "Kol-vo deistvii: " << kd << '\n';
- return 1;
- }
- if (v[m] > a)// если середина больше искомого числа, значит, что наше число левее середины, поэтому правую границу поиска смещаем влево
- {
- r = m;
- }
- else// иначе, искомое число правее середины, тогда смещаем левую гарницу вправо
- {
- l = m + 1;
- }
- }
- cout << "Kol-vo deistvii: " << kd << '\n';
- return 0;
- }
- bool linearSearch(vector <int> v, int a) //Функция линейного поиска
- {
- int kd(0);//тоже самое, что и в бинарном поиске
- bool f(0);//флаг, для того, чтобы знать, нашли мы число или нет
- //линейный поиск может работать на неотсортированной последоваетльности, поэтому мы ничего не сортируем
- for (int i = 0; i < v.size(); ++i)
- {
- kd++;//считаем кол-во сравений
- if (v[i] == a)//если нашли число, то "поднимаем" флаг и выхожим из цикла
- {
- f = 1;
- break;
- }
- }
- cout << "Kol-vo deistvii: " << kd << '\n';
- return f;
- }
- int main()
- {
- int sz;//размер массива, который вводим ниже
- cout << "Input size of array: ";
- cin >> sz;
- vector <int> v(sz);//сам массив
- srand(time(NULL));//это для того, чтобы рандомно заполнять массив разными числами
- for (int i = 0; i < sz; ++i)
- {
- v[i] = rand() % 100;//вот тут происходит заполнение, возможные числа от 0 до 100, вроде...
- cout << v[i] << ' ';
- }
- int a, type;//а - число, которое мы ищем, type - тип поиска, который мы выибраем ниже
- cout << "\nInput number, you want to find: ";
- cin >> a;
- cout << "Choose algorithm of search:\n1) Linear search\n2) Binary search\n3) Stop\n"; //здесь выбираем
- while (true)//цикл будет работать вчено, пока не будет введена "3", это чтобы постоянно не перезапускать программу
- {
- cin >> type;//вернее здесь выбираем))
- if (type == 1)
- {
- if (linearSearch(v, a))//вызываем функцию линейного поиска, которая возвращает либо true, либо false
- {
- cout << a << " is in the sequence\n";//если true, то число есть в последовательности
- }
- else
- {
- cout << a << " is not in the sequence\n";//если false - нет в последовательности
- }
- }
- else if (type == 2)
- {
- if(binarySearch(v, a))//всё тоже саме, что и выше
- {
- cout << a << " is in the sequence\n";
- }
- else
- {
- cout << a << " is not in the sequence\n";
- }
- }
- else if (type == 3)// это для того, чтобы закончить программу
- {
- cout << "End of programm\n";
- break;
- }
- else
- cout << "Incorrect type of search, try again!\n";//это для того, если ввели неправильный тип (не 1, 2 или 3)
- cout << "Choose algorithm of search (if needed):\n1) Linear search\n2) Binary search\n3) Stop\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement