Console.Write("Введите искомое значение или -777 для выхода: ");
var k = Convert.ToInt32(Console. ReadLine());
if (k == -777){ break; }
var searchResult = BinarySearch(array, k, 0, array.Length - 1);
Рекурсивная реализация бинарного поиска
if (searchResult < 0){
Console.WriteLine("Элемент со значением {0} не найден", k);
} else{
Console.WriteLine("Элемент найден. Индекс элемента со значением {0} равен {1}", k, searchResult);
}
}
Console.ReadLine();
}
}
Итеративная реализация бинарного поиска
//метод бинарного поиска с использованием цикла
static int BinarySearch(int[] array, int searchedValue, int left, int right)
{ //пока не сошлись границы массива
while (left <= right)
{ //индекс среднего элемента
var middle = (left + right) / 2;
if (searchedValue == array[middle])
{ return middle;
}
else if (searchedValue < array[middle])
{
Итеративная реализация бинарного поиска
//сужаем рабочую зону массива с правой стороны
right = middle - 1;
}
else
{
//сужаем рабочую зону массива с левой стороны
left = middle + 1;
}
}
//ничего не нашли
return -1;
}
Двоичный поиск
N
линейный поиск
двоичный поиск
2
2
2
16
16
5
1024
1024
11
1048576
1048576
21
скорость выше, чем при линейном поиске
нужна предварительная сортировка
Когда нужно применять?
?
Число сравнений:
Задачи
«A»: Заполнить массив случайными числами и отсортировать его. Ввести число X. Используя двоичный поиск, определить, есть ли в массиве число, равное X. Подсчитать количество сравнений.
Пример:
Массив:
1 4 7 3 9 2 4 5 2
После сортировки:
1 2 2 3 4 4 5 7 9
Введите число X:
2
Число 2 найдено.
Количество сравнений: 2
Задачи
«B»: Заполнить массив случайными числами и отсортировать его. Ввести число X. Используя двоичный поиск, определить, сколько чисел, равных X, находится в массиве.
Пример:
Массив:
1 4 7 3 9 2 4 5 2
После сортировки:
1 2 2 3 4 4 5 7 9
Введите число X:
4
Число 4 встречается 2 раз(а).
Пример:
Массив:
1 4 7 3 9 2 4 5 2
После сортировки:
1 2 2 3 4 4 5 7 9
Введите число X:
14
Число 14 не встречается.
Задачи
«C»: Заполнить массив случайными числами и ввести число и отсортировать его. Ввести число X. Используя двоичный поиск, определить, есть ли в массиве число, равное X. Если такого числа нет, вывести число, ближайшее к X.