Рубрики
Без рубрики

Что такое Quicksort.

Реализация алгоритма Quicksort в Python и Ocaml. Помечено новичками, Ocaml, Python, алгоритмыми.

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”