Вы находитесь на странице: 1из 5

Линейный 

или последовательный поиск – один из самых простых


алгоритмов поиска элемента в массиве.

Алгоритм заключается в последовательном обходе всех элементов


неупорядоченного массива, как правило, слева направо, и сравнения их
с ключевым значением. Если значения элемента и ключа совпадают, то
поиск, в зависимости от назначения, возвращает значение или индекс
элемента.

Линейный поиск применяется для нахождения:

 индекса заданного элемента массива;


 индексов минимального или максимального элемента;
 минимального или максимального значения в массиве;

Рассмотрим методы расширения, которые реализуют выше


перечисленные варианты. Для того, чтобы методы можно было
применять к разным типам данных, будем использовать универсальные
шаблоны(generics).

Для начала создадим статический класс, в который будем помещать все


рассмотренные методы. По скольку не имеет смысла работать с пустым
массивом, добавим в класс метод для проверки:

public static class ArrayExt


{
private static void CheckArray<T>(T[] a)
{
if (a == null)
{
throw new ArgumentNullException("Массив не
может быть нулевым");
}

if (a.Length == 0)
{
throw new ArgumentException("Длина массива
должна быть больше нуля");
}
}
}

Метод для линейного поиска по


значению
Принимает в качестве аргументов массив и искомое значение, а
возвращает индекс найденного элемента, или -1 в случае неудачи. Тип
данных ограничен структурами для которых реализован интерфейс
сравнения IEquatable.

public static int LinearSearch<T>(this T[] a, T key)


where T : struct, IEquatable<T>
{
CheckArray(a);

for (int i = 0; i < a.Length; ++i)


{
// сравниваем текущее значение с искомым
if (a[i].Equals(key))
{
return i;
}
}
//если ничего не нашли
return -1;
}

Бинарный поиск

Бинарный поиск (binary search) – алгоритм поиска индекса элемента в


упорядоченном массиве, на каждой итерации происходит деление
массива на две части, по этой причине алгоритм называют методом
деления пополам.

Метод бинарного поиска достаточно прост для понимания, в то же время


он очень эффективен. Поскольку на каждой итерации количество
элементов в рабочей области массива уменьшается вдвое.

Описание алгоритма бинарного поиска


Алгоритм заключается в следующем:

 Определяем значение элемента в середине рабочей области


массива данных и сравниваем его с искомым;
 Если они равны, возвращаем индекс середины;
 Если значение элемента в середине массива больше искомого, то
поиск продолжается в левой, от среднего элемента, части массива,
иначе в правой;
 Проверяем не сошлись ли границы рабочей области, если да -
искомого значения нет, нет - переходим на первый шаг.

Рекурсивная реализация бинарного


поиска
using System;

class Program
{
//метод для рекурсивного бинарного поиска
static int BinarySearch(int[] array, int
searchedValue, int first, int last)
{
//границы сошлись
if (first > last)
{
//элемент не найден
return -1;
}

//средний индекс подмассива


var middle = (first + last) / 2;
//значение в средине подмассива
var middleValue = array[middle];

if (middleValue == searchedValue)
{
return middle;
}
else
{
if (middleValue > searchedValue)
{
//рекурсивный вызов поиска для левого
подмассива
return BinarySearch(array, searchedValue,
first, middle - 1);
}
else
{
//рекурсивный вызов поиска для правого
подмассива
return BinarySearch(array, searchedValue,
middle + 1, last);
}
}
}

//программа для бинарного поиска элемента в


упорядоченном массиве
static void Main(string[] args)
{
Console.WriteLine("Бинарный поиск(рекурсивная
реализация)");
Console.Write("Введите элементы массива: ");
var s = Console.ReadLine().Split(new[] { " ",
",", ";" }, StringSplitOptions.RemoveEmptyEntries);
var array = new int[s.Length];
for (int i = 0; i < s.Length; i++)
{
array[i] = Convert.ToInt32(s[i]);
}

//сортируем массив
Array.Sort(array);
Console.WriteLine("Упорядоченный массив: {0}",
string.Join(", ", array));

while (true)
{
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();
}
}