Приклад 2. Лінійний пошук на мові с#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Search
{
class Program
{
static void Main(string[] args)
{
int i, n, key, nom;
bool x = false;
Console.WriteLine("Розмір масиву");
n = int.Parse(Console.ReadLine());
int [] mas = new int[n]; //визначення масиву
Console.WriteLine("Шуканий елемент");
key = int.Parse(Console.ReadLine());
// Random - клас для генерації випадкових чисел
Random aRand = new Random();
for (i = 0; i < n; i++)
{
//формування масиву, заповнення його випадковими числами
mas[i] = aRand.Next(n);
Console.Write(mas[i] +" ");
}
for (i = 0; i < n; i++)
{ //якщо цей елемент дорівнює шуканому
if (mas[i] == key) //то x призначаємо true
{ x = true; nom = i; break; } //і виходимо з циклу
}
if (x == true)
Console.WriteLine("Елемент знайдено");
else Console.WriteLine("\nЕлемент не знайдено");
Console.ReadKey();
}
}
}
Наступний приклад є простою модифікацією лінійного пошуку для обчислення кількості шуканих елементів у масиві. Масив оголошується безпосередньо в коді.
Приклад 3. Пошук кількості одиниць у масиві
namespace Lab7_Search
{
class Program
{
static void Main(string[] args)
{
//пошук кількості одиниць у масиві
int key=1; // шуканий елемент
int kilkist=0; // кількість знайдених елементів
int[] mas = { 1, 2, 5, 3, 7, 5, 1, 3, 4,1 };
for (int i = 0; i < mas.Length; i++)
{ //якщо цей елемент дорівнює шуканому
if (mas[i] == key)
kilkist ++; //інкремент - збільшення на 1
}
Console.WriteLine("У масиві знайдено одиниць: " + kilkist);
Console.ReadKey();
}
}
}
7.2. Двійковий пошук
Двійковий (бінарний) пошук (також відомий як метод ділення навпіл і дихотомія) — класичний алгоритм пошуку елемента у відсортованому масиві.
Формальний запис алгоритму:
Масив ділитися на дві рівні частини, шляхом визначення першого (a), останнього (b) і середнього (c) елементів;
Середній елемент порівнюється з шуканим (s):
якщо s<c. Останньому елементу призначається значення середнього, тим самим ділянка пошуку зменшується удвічі: b=c;
якщо s>c. Першому елементу призначається значення середнього, і ділянка пошуку зменшується удвічі: a=c;
якщо s=c. Елемент знайдений, і робота алгоритму завершується.
Якщо для перевірки не залишився жодного елементу, то алгоритм завершується, інакше виконується перехід до пункту 2.
У таблиці нижче представлений конкретний масив, і покроковий процес роботи алгоритму бінарного пошуку на ньому. Є послідовність цілих чисел, розташованих в порядку зростання, а також шукане число 16. Спочатку у змінні записуються числа, що знаходяться на різних кінцях масиву (1 і 81). Їх індекси мають значення 1 і 9 відповідно. Далі обчислюється номер середнього елементу, для чого, як правило, використовується формула (a+b)/2, або a+(b - a)/2 (далі в прикладі програми буде використана друга формула, як найбільш стійка до переповнювань). Після порівняння виявляється, що шуканий елемент менший за середній, і тому наступний пошук здійснюється в лівій частині послідовності. Алгоритм продовжує виконуватися так само, до знаходження на 4 кроці шуканого елементу.
Варто зазначити, що тут буде потрібно значно менше часу, ніж якщо б ми скористалися лінійним пошуком, але для роботи алгоритму бінарного пошуку потрібно строго відсортований масив, причому неважливо за збільшенням або зменшенням він впорядкований.