
Приклад 3. Реалізація двійкового пошуку на мові с#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BinarySearch
{
class Program
{
static void Main(string[] args)
{
int i, n, key, begin, end, c;
bool x = false;
Console.WriteLine("Розмір масиву");
n = int.Parse(Console.ReadLine());
int [] mas = new int[n]; //визначення масиву
Console.WriteLine("Шуканий елемент");
key = int.Parse(Console.ReadLine());
for (i = 0; i < n; i++)
{
//формування масиву, заповнення його числами кратними n (10,20,....)
mas[i] = n * i;
Console.Write(mas[i] +" ");
}
begin = 0; end = n; //ліва і права границі масиву
while (begin < end)
{
// власне реалізація алгоритму
c = begin + (end - begin) / 2;
if (key < mas[c]) end = c;
else if (key > mas[c]) begin = c + 1;
else { x = true; break; }
}
if (x == true)
Console.WriteLine("Елемент знайдено");
else Console.WriteLine("\nЕлемент не знайдено");
Console.ReadKey();
}
}
}
Не дивлячись на те, що код досить простий, в ньому є декілька пасток.
Що буде, якщо first і last окремо уміщаються в свій тип, а first+last — ні?
Чи працюватиме алгоритм на порожньому масиві (n=0)?
Чи здатний код знаходити відсутні значення? У деяких програмістів написаний «з аркуша» двійковий пошук в такій ситуації зациклюється — і вони цього не усвідомлюють, поки тестування не дасть помилку.
Інколи потрібно, аби, якщо x в ланцюжку існує в декількох екземплярах, знаходити не будь-який, а обов'язково перший (як варіант: останній; наступний за останнім). Дана версія коду в такій ситуації знаходить перший з рівних.
Практичні застосування методу двійкового пошуку різноманітні:
Широке поширення в інформатиці стосовно пошуку в структурах даних. Наприклад, пошук в масивах даних здійснюється по ключу, призначеному кожному з елементів масиву (у простому випадку сам елемент є ключем).
Також його застосовують як чисельний метод для знаходження наближених коренів рівнянь.
Метод використовується для знаходження екстремуму цільової функції і в цьому випадку є методом умовної одновимірної оптимізації.
Завдання і вправи
1. Знайти методом лінійного пошуку кількість вказаних цифр в масиві {1,2,5,3,7,5,1,3,4}
2. Знайти методом лінійного пошуку максимальний і мінімальний елементи в масиві {4,5,2,3,8,7,6,1}
3. Знайти методом двійкового пошуку потрібний елемент у масиві розміру 100.