Лінійний або послідовний пошук – один з найпростіших алгоритмів пошуку елементів в масиві.

Алгоритм полягає у послідовному обході всіх елементів не впорядкованого масиву, як правило, зліва на право, та порівняння їх з ключовим значенням. Якщо значення елементу та ключа однакові, то пошук, в залежності від призначення, повертає значення чи індекс елементу.

Лінійний пошук використовується для знаходження:

  • індексу заданого елементу масиву;
  • індексів мінімального або максимального елементу;
  • мінімального чи максимального значення в масиві.

Розглянемо методи розширення, які реалізують вище перераховані варіанти. Для того, щоб методи можна було застосовувати до різних типів даних, будемо використовувати універсальні шаблони(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;
}

Пошук індексу мінімального елементу

Дозволяє знайти індекс першого найменшого значення в масиві. Тип вхідних аргументів обмежений структурами з реалізованим інтерфейсом IComparable.

public static int IndexOfMin<T>(this T[] a) where T : struct, IComparable<T>
{
    CheckArray(a);

    int indexMin = 0;
    T min = a[0];
    for (int i = 1; i < a.Length; ++i)
    {
        if (a[i].CompareTo(min) < 0) // аналог запису a[i] < min
        {
            min = a[i];
            indexMin = i;
        }
    }

    return indexMin;
}

Пошук мінімального значення масиву

Дозволяє знайти найменший елемент масиву.

public static T MinValue<T>(this T[] a) where T : struct, IComparable<T>
{
    CheckArray(a);

    T min = a[0];
    for (int i = 1; i < a.Length; ++i)
    {
        if (a[i].CompareTo(min) < 0)
        {
            min = a[i];
        }
    }

    return min;
}

Пошук індексу максимального елементу

Дозволяє знайти позицію першого найбільшого значення.

public static int IndexOfMax<T>(this T[] a) where T : struct, IComparable<T>
{
    CheckArray(a);

    int indexMax = 0;
    T max = a[0];
    for (int i = 1; i < a.Length; ++i)
    {
        if (a[i].CompareTo(max) > 0) //аналог запису a[i] > max
        {
            max = a[i];
            indexMax = i;
        }
    }

    return indexMax;
}

Пошук максимального значення масиву

Дозволяє знайти найбільший елемент в масиві.

public static T MaxValue<T>(this T[] a) where T : struct, IComparable<T>
{
    CheckArray(a);

    T max = a[0];
    for (int i = 1; i < a.Length; ++i)
    {
        if (a[i].CompareTo(max) > 0)
        {
            max = a[i];
        }
    }

    return max;
}

Використання методів для послідовного пошуку

class Program
{
    static void Main(string[] args)
    {
        int[] arr = { 5, 6, 2, 4, 9, 0, 1, 3, 7, 8 };

        var index = arr.LinearSearch(22);
        if (index == -1)
        {
            Console.WriteLine("Елемент не знайдено");
        }

        Console.WriteLine($"Індекс елементу зі значенням 4 рівний {arr.LinearSearch(4)}");
        Console.WriteLine($"Мінімальний елемент масиву: індекс {arr.IndexOfMin()}; значення {arr.MinValue()};");
        Console.WriteLine($"Максимальний елемент масиву: індекс {arr.IndexOfMax()}; значення {arr.MaxValue()};");

        Console.ReadLine();
    }
}

В C# вже є реалізація, більшої частини, методів розглянутих в цій статті, алгоритми приводяться в якості навчальних матеріалів.

Дивіться також: