Быстрой сортировки на Haskell - что это на самом деле? [дубликат]

этот вопрос уже есть ответ здесь:

Как говорится, "true quicksort сортирует на месте". Так что стандарт короткий код Хаскелла на quicksort,

quicksort :: Ord a => [a] -> [a]
quicksort []     = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
  where
    lesser  = filter (< p) xs
    greater = filter (>= p) xs

какой алгоритм / вычислительный процесс is это описание, в конце концов?

Это, конечно, не что придумал Тони хор, не имея своей самой определяющей функции, алгоритм разбиения на месте.

(ответ может быть хорошо известен, но еще не здесь).


исправление: этот вопрос на самом деле дубликат: ответ is известно на так ведь: ср. псевдо-quicksort сложность времени .

3 ответов


Это quicksort для связанных списков.

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

Я бы предпочел сказать ,что "quicksort был первоначально разработан для работы на месте", чем"true quicksort выполняется на месте". Существует много вариантов quicksort, включая выбор шарниров случайным образом, чтобы избежать хуже-дело в поведении и т. д.. Это разумное, четкое определение quicksort для связанных списков.

это определение точно соответствует тому, как мы учим quicksort 16-летним студентам математики в Великобритании. (Мы обучаем алгоритмам, а не программированию.) In-place очень сильно скрывает цель и дизайн, поэтому мы не учим этой детали, несмотря на то, что миллион миль от обучения функциональному программированию или связанным спискам. (Это не меняет того факта, что трюк с обменом парами на месте алгоритм лучше всего, когда у вас есть разрушительные массивы обновление.)

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


все алгоритмы на месте требуют некоторой "церемонии" в Haskell, где изменяемое состояние скрыто за монадой. Алгоритм выше is быстрая сортировка, просто не на месте.


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