Skip to content

Быстрая сортировка (Quick sort)

Быстрая сортировка - это эффективный алгоритм сортировки, использующий стратегию "разделяй и властвуй". Он выбирает один элемент в качестве опорного и разделяет массив на две части: элементы меньше опорного и элементы больше опорного, затем рекурсивно применяет ту же стратегию к этим подмассивам.

Алгоритм

Алгоритм быстрой сортировки работает следующим образом:

  1. Выбираем опорный элемент из массива.
  2. Перегруппировываем элементы в массиве так, что элементы меньше опорного перемещаются перед ним, а большие - после.
  3. Рекурсивно применяем те же шаги к подмассивам слева и справа от опорного элемента.

Анализ сложности

  • Временная сложность быстрой сортировки: В среднем и худшем случаях O(nlogn), где n - количество элементов. В худшем случае (когда каждый раз выбирается наихудший опорный элемент) - O(n2).
  • Пространственная сложность быстрой сортировки: O(logn) из-за использования стека вызовов при рекурсии.

Реализация

Приведём примеры реализации быстрой сортировки:

py
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)
cpp
#include <vector>

void quickSort(std::vector<int>& arr, int low, int high) {
    if (low < high) {
        int pivot = partition(arr, low, high);
        quickSort(arr, low, pivot - 1);
        quickSort(arr, pivot + 1, high);
    }
}

int partition(std::vector<int>& arr, int low, int high) {
    int pivot = arr[high];
    int i = (low - 1);

    for (int j = low; j <= high - 1; j++) {
        if (arr[j] < pivot) {
            i++;
            std::swap(arr[i], arr[j]);
        }
    }
    std::swap(arr[i + 1], arr[high]);
    return (i + 1);
}
java
public void quickSort(int[] arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

private int partition(int[] arr, int low, int high) {
    int pivot = arr[high]; 
    int i = (low - 1);
    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;
    return i + 1;
}

Заключение

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

Основываясь на стратегии "разделяй и властвуй", быстрая сортировка обеспечивает хорошую производительность в среднем и лучшем случаях, хотя в худшем случае её производительность может снижаться до O(n2). Это делает важным выбор опорного элемента и может потребовать дополнительных оптимизаций в зависимости от характера входных данных.

Содержание доступно по лицензии MIT