algo

Олимпиадные алгоритмы

Быстрая сортировка

Алгоритм быстрой сортировки работает быстрее, чем сортировка пузырьком и сортировка вставками, а именно за $O(N \log N)$ операций в большинстве случаев. В отличие от алгоритмов, которые сравнивают соседние элементы и идут по массиву линейно (из-за чего такие алгоритмы часто работают за $O(N^2)$ в худшем случае), быстрая сортировка работает рекурсивно.

В массиве случайно выбирается опорный элемент (pivot), часто это первый или последний элемент. Затем массив делится на три группы: элементы, которые больше опорного элемента, меньше его и равны ему. Потом эта же функция рекуррентно обрабатывает массивы less и greater. Таким образом, когда обрабатываемый массив будет содержать только один элемент, функция вернет этот массив.

    def quicksort(mas):
        less, equal, greater = [], [], []
        
        if len(mas) > 1:
            pivot = mas[0]
        
            for item in mas:
                if item < pivot:
                    less.append(item)
                elif item == pivot:
                    equal.append(item)
                elif item > pivot:
                    greater.append(item)
            return quicksort(less) + equal + quicksort(greater)
        
        else:
            return mas

Принцип работы быстрой сортировки можно представить в виде следующей схемы:

Quicksort

Мы видим, что массив “ветвится” на подмассивы и в конце полученные части соединяются в отсортированный массив благодаря тому, что функция возвращает quicksort(less) + equal + quicksort(greater) именно в таком порядке.