Быстрой сортировки на Haskell - что это на самом деле? [дубликат]
этот вопрос уже есть ответ здесь:
- псевдо-quicksort сложность времени 6 ответов
Как говорится, "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.