QuickSort – это популярный и общий алгоритм сортировки, который, как известно, был Действительно эффективный. Это создает 1959 год и опубликовал в 1961 году Тони Хоар (Он известен нулевым эталонным, процессам и структурированным программированием и т. Д.
Затем давайте попадаем в алгоритм. Если нам нужно визуализировать алгоритм, мы можем визуализировать это так:
Как работает алгоритм:
Проверьте, если список пусты или наоборот Если список один элемент возвращает элемент, остальное, продолжать функцию.
Выберите поворот Пивот обычно является первым элементом списка. Но поворот может быть любым элементом списка тоже. Например:
[b, a, d, e, c], Our pivot is b
- Фильтровать меньшие/большие числа, чем Pivot (
A
) В принципе, вы должны итерации на элементы списка и получить больше числа, чем Pivot (A
). Тогда вы должны сделать то же самое для меньших номеров тоже. Например:
bigger = Filter numbers in [b, a, d, e, c] bigger than a smaller = Filter numbers in [b, a, d, e, c] smaller than or equal to a
- Сортировать фильтрованную
больше
именьший
Числа и совпадают в них сейчас, мы будем сортироваться (используя тот же алгоритмбольше
именьший
Числа, чтобы получить заказ в них и совпадать с поворотом (A
)
quicksort(smaller) + [a] + quicksort(bigger)
Затем мы закончили наш алгоритм! Теперь давайте реализуем его в Python & Ocaml.
Я пытался комментировать Python Olot для начинающие понять код.
def quicksort(array): if not array: # If list is empty return [] pivot = array[0] # Pivot is the first element of list smaller = [n for n in array if n < pivot] # Filter the smaller numbers bigger = [n for n in array if n > pivot] # Filter the bigger numbers return quicksort(smaller) + [pivot] + quicksort(bigger) # Concenate sorted smaller and sorted bigger with pivot
Теперь давайте реализуем его в Ocaml!
let rec quicksort list = match list with | [] -> [] | pivot :: _ -> let smaller = List.filter (fun n -> n < pivot) list in let bigger = List.filter (fun n -> n > pivot) list in quicksort(smaller) @ [pivot] @ quicksort(bigger)
Давайте попробуем запустить его в REPL
# quicksort [5, 1, 9, 4, 6, 7, 3];; - : (int * int * int * int * int * int * int) list = [(5, 1, 9, 4, 6, 7, 3)]
Оно работает! (После 18 попыток)
И, наконец, производительность QuickSort:
- Худшая производительность:
O (N2)
- Средняя производительность:
O (n log n)
- Лучшая производительность:
O (n log n)
Среднее и лучшее представление одинаково.
Если нам нужно визуализировать отсортированный список:
(Особое спасибо, чтобы узнать вам haskell для великого хорошего! Для фото. Это действительно хорошие главы Haskell!)
В следующих постах я поделюсь в QuickSelect Algorithm, разработанный тем же человеком, разработанный QuickSort ( Тони Хоар )! Прощай!
Оригинал: “https://dev.to/lyfolos/what-is-quicksort-50i”