Рубрика: Курс Алгоритмы

  • Базовые алгоритмы сортировки (PHP)

    Базовые алгоритмы сортировки (PHP)

    Сортировка — одна из фундаментальных операций в программировании, встречающаяся в различных приложениях, таких как базы данных, поисковые системы и системы обработки данных. Сортировка позволяет упорядочивать элементы массива или списка на основе определенных критериев (например, по возрастанию или убыванию). Существуют различные алгоритмы сортировки, каждый из которых имеет свои особенности, преимущества и недостатки. В этом уроке мы рассмотрим некоторые базовые алгоритмы сортировки, их реализацию в PHP и проанализируем их сложность.


    Алгоритмы сортировки

    Сортировка пузырьком

    Описание:  Сортировка пузырьком — один из простейших алгоритмов сортировки. Он многократно проходит по массиву, сравнивая соседние элементы и меняя их местами, если они находятся в неправильном порядке. Этот процесс повторяется до тех пор, пока массив не будет отсортирован.

    Алгоритм:

    1. Пройтись по массиву от первого до последнего элемента.
    2. Сравните каждый элемент с соседним элементом.
    3. Если текущий элемент больше следующего, поменяйте их местами.
    4. Повторяйте процесс, пока массив не будет отсортирован.

    Реализация на PHP:

    function bubbleSort($arr) {
    $n = count($arr);
    for ($i = 0; $i < $n; $i++) {
    for ($j = 0; $j < $n - $i - 1; $j++) {
    if ($arr[$j] > $arr[$j + 1]) {
    // Swap elements
    $temp = $arr[$j];
    $arr[$j] = $arr[$j + 1];
    $arr[$j + 1] = $temp;
    }
    }
    }
    return $arr;
    }

    // Example function call
    $arr = [64, 34, 25, 12, 22, 11, 90];
    $sortedArr = bubbleSort($arr);

    echo "Sorted array: ";
    print_r($sortedArr);

    Сложность:

    • Худший случай: O(n²) — возникает, когда массив сортируется в обратном порядке.
    • Лучший случай: O(n) — если массив уже отсортирован, пузырьковая сортировка может выполнить минимальное количество операций.

    Сортировка по выбору

    Описание:  Сортировка выбором находит наименьший элемент в массиве и меняет его местами с первым элементом. Затем алгоритм повторяет этот процесс для оставшейся неотсортированной части массива.

    Алгоритм:

    1. Пройдитесь по массиву и найдите минимальный элемент.
    2. Поменяйте его местами с первым элементом.
    3. Повторите эти действия для оставшейся части массива.

    Реализация на PHP:

    function selectionSort($arr) {
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
    $minIndex = $i;
    for ($j = $i + 1; $j < $n; $j++) {
    if ($arr[$j] < $arr[$minIndex]) {
    $minIndex = $j;
    }
    }
    // Swap the found minimum element with the first element
    $temp = $arr[$minIndex];
    $arr[$minIndex] = $arr[$i];
    $arr[$i] = $temp;
    }
    return $arr;
    }

    // Example function call
    $arr = [64, 25, 12, 22, 11];
    $sortedArr = selectionSort($arr);

    echo "Sorted array: ";
    print_r($sortedArr);

    Сложность:

    • Худший и лучший случай: O(n²), так как количество операций не зависит от того, отсортирован ли массив.

    Сортировка вставкой

    Описание:  Сортировка вставками работает как сортировка карт в вашей руке: элементы массива вставляются в правильную позицию среди уже отсортированных элементов.

    Алгоритм:

    1. Начните со второго элемента и рассмотрите его как часть отсортированной последовательности.
    2. Вставить текущий элемент в правильную позицию в отсортированной части массива.
    3. Повторите для всех элементов.

    Реализация на PHP:

    function insertionSort($arr) {
    $n = count($arr);
    for ($i = 1; $i < $n; $i++) {
    $key = $arr[$i];
    $j = $i - 1;

    // Move elements greater than the key one position ahead
    while ($j >= 0 && $arr[$j] > $key) {
    $arr[$j + 1] = $arr[$j];
    $j = $j - 1;
    }
    $arr[$j + 1] = $key;
    }
    return $arr;
    }

    // Example function call
    $arr = [12, 11, 13, 5, 6];
    $sortedArr = insertionSort($arr);

    echo "Sorted array: ";
    print_r($sortedArr);

    Сложность:

    • Худший случай: O(n²) — возникает, когда массив сортируется в обратном порядке.
    • Лучший случай: O(n) — если массив уже отсортирован.

    Рекомендуемая литература:

    1. «Изучаем алгоритмы» Адитьи Бхаргавы.  Отличная книга для начинающих, в которой объясняются основные алгоритмы с наглядными иллюстрациями и примерами (написана на Python, но может быть легко адаптирована для PHP).
    2. «Введение в алгоритмы» Томаса Кормена и др.  Классическая книга по алгоритмам, охватывающая более сложные и продвинутые алгоритмы, такие как быстрая сортировка и сортировка слиянием.
    3. «Алгоритмы PHP» Мизанура Рахмана  Книга с реализациями алгоритмов специально на PHP.

    Заключение

    Сегодня мы рассмотрели несколько базовых алгоритмов сортировки, таких как пузырьковая сортировка, сортировка выбором и сортировка вставкой. Эти алгоритмы просты в реализации, но различаются по эффективности в зависимости от ситуации. На следующем уроке мы рассмотрим более сложные алгоритмы, такие как быстрая сортировка и сортировка слиянием, которые используются для сортировки больших наборов данных.

  • Введение в алгоритмы

    Введение в алгоритмы

    Алгоритмы и программирование

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

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

    Основные свойства алгоритмов:

    1. Конечность  — алгоритм должен завершиться после завершения всех шагов.
    2. Определенность  — каждый шаг алгоритма должен быть четко определен.
    3. Эффективность  — выполнение алгоритма должно приводить к решению проблемы.
    4. Универсальность  — алгоритм должен применяться к широкому кругу задач одного типа.

    Пример : алгоритм нахождения суммы всех чисел в массиве:

    1. Инициализируйте переменную для суммы значением 0.
    2. Пройдитесь по каждому числу в массиве и добавьте его к сумме.
    3. После обработки всех чисел выведите результат.

    Асимптотическая нотация: введение в анализ сложности

    В программировании важно не только убедиться, что алгоритм работает правильно, но и оценить его эффективность. По мере увеличения объема данных выполнение алгоритма может потребовать больше времени и ресурсов. Поэтому важно оценить, сколько шагов или операций алгоритму требуется для решения задачи — это называется анализом сложности .

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

    1. Большое O (O)  — описывает верхнюю границу числа операций, которые могут потребоваться алгоритму в худшем случае. Это самая популярная нотация, поскольку она показывает наихудший возможный случай.
    2. Ω (Омега)  — описывает минимальное количество операций, необходимых в лучшем случае.
    3. Θ (Тета)  — описывает точное количество требуемых операций, если оно одинаково для лучшего и худшего случаев.

    Наглядный пример:

    • Линейный поиск : пример поиска элемента в несортированном массиве. Алгоритм сканирует все элементы, пока не будет найдено целевое значение. В худшем случае алгоритм выполнит n операций, где n — количество элементов в массиве (O(n)).
    • Двоичный поиск : пример поиска в отсортированном массиве. Алгоритм делит массив на две части и продолжает поиск в одной половине, уменьшая количество элементов вдвое с каждым шагом. Это приводит к логарифмическому росту количества операций — O(log n), что делает бинарный поиск намного более эффективным на больших наборах данных.

    Структуры данных: массивы, списки и другие

    Алгоритмы работают с данными, и правильная организация этих данных является ключом к эффективному решению задач. Структуры данных — это способы хранения и организации информации, позволяющие эффективно выполнять различные операции, такие как поиск, добавление или удаление элементов.

    Ключевые структуры данных:

    1. Массивы  — упорядоченные последовательности элементов одного типа. Массивы позволяют осуществлять быстрый доступ к элементам по индексу, но имеют фиксированный размер.
    2. Списки  — динамические структуры данных, которые могут менять размер. Списки более гибкие, чем массивы, но доступ к элементам может занять больше времени.
    3. Стеки  — структуры данных, работающие по принципу «последним пришел, первым вышел» (LIFO). Они часто используются для хранения промежуточных результатов или для реализации рекурсивных алгоритмов.
    4. Очереди  — работают по принципу «первым пришел — первым ушел» (FIFO), что делает их полезными для обработки задач в порядке их поступления.