Здравствуйте, Basil B, Вы писали:
BB>Предлагаю обменяться мнениями по поводу того, имеет ли право этот "знаменитый двустрочник" на хаскеле называться quicksort-ом, и почему: BB>
BB>qsort [] = []
BB>qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]
BB>
Code like the above has been used up and down the tubes to demonstrate the superiority of functional languages. It's a functional-style quicksort written in Haskell that can be understood, at least according to some, without any prior exposure. First line: qsort of the empty list is the empty list. Second line (broken to fit in a narrow space): qsort for a list starting with x followed by some more xs is a concatenation ('++') of three lists: all stuff in xs that's smaller than x sorted, x itself, and all stuff in xs that's greater than or equal to x, again sorted. Try defining quicksort in two lines in your Blub language!
As much as I like Haskell, I look at that example with a mix of admiration and indignation, same as I'd look at an example illustrating C's virtues by means of a buffer overrun exploit. Both cases inspire awe, but I think they illustrate something bad rather than something good, and I could never bring myself to write or use that kind of trick.
There are a few things about qsort that don't quite cut the mustard. For starters, qsort is not really quicksort. Quicksort, as defined by Hoare in his seminal paper [8], is an in-place algorithm. Hoare's in-place partition is his paper's main contribution and a quintessential part of quicksort. qsort is not in-place, so it could be at best considered an exercise inspired by quicksort. (And not a great exercise at that. It does so much ancillary work it's not even funny—did you think that those two passes through the list and all those concatenations come for free?) Second, qsort makes a patently bad choice of pivot by selecting the first element of the sequence, thus nicely guaranteeing quadratic performance for almost sorted data. And the thing is, in reality, input data is seldom really random. It might have been sorted at some point, then augmented with additional elements, to be sorted again later. Choosing a random pivot is the correct solution, but you see, that would make qsort quite a lot longer than three lines, because selecting one element at random from a singly-linked list is a non-trivial undertaking.
...
Помимо того что это не inplace (который был существенной частью оригинальной статьи), и как отметил Александреску тут совсем другой partition, тут ещё не используется приём дающий гарантию на логарифмичестий размер стека worst case, описанный в той же самой оригинальной статье шестидесятых годов.
Здравствуйте, Basil B, Вы писали:
BB>Здравствуйте, Basil B, Вы писали:
BB>Мое мнение: не может, поскольку цель создания алгоритма — достижение результата с определенной затратой времени и памяти — здесь очевидно похерена. получилось нечто напомниающее карго-культ: вроде все похоже на настоящее, но не работает.
Inplace-сортировка в хаскеле нереализуема по простой причине — там всё неизменяемое. Так что претензия странная.
Реализация, конечно, "на скорую руку", но суть алгоритма демонстрирует, по крайней мере применительно к иммутабельным спискам. Несложно сделать любую желаемую модификацию, хоть посередине выбирать точку, хоть в случайном месте.
Называть ли это quick sort-ом? Ну если у этого названия нет trademark-а, то называть. Не обязательно название алгоритма должно использоваться исключительно в каноничном виде. В общем вопрос определений.
Здравствуйте, _DAle_, Вы писали:
EP>>Это их фейл. EP>>Даже Степанов этот момент упоминал, конкретно Lomuto vs Hoare partition в CLRS (34:18): EP>>https://youtu.be/d4tFGtGngf4?t=2058 EP>>ЕМНИП даже кто-то из CLRS это в своей лекции что-то такое упоминал. _DA>Окей. Я не согласен. Я считаю, что тот конкретный алгоритм, который когда-то описал Хоар — это одна из реализаций того, что сейчас называется Quicksort (а та конкретная называется сортировкой Хоара). На мой взгляд, сейчас (а не в прошлом веке) по термином Quicksort подразумевают семейство алгоритмов (например, в той же википедии это так), с конкретным подходом: divide and conquer + pivot, и вполне определенной временной сложностью по времени в среднем и худшем случае.
Ошибаются, IMO. Также как и часто путают selection sort и bubble sort. Также как и отнесли трюк с логарифмическим стеком Седжвику.
_DA>Если считать, что, например, Lomuto partition — это уже не Quicksort, не in-place реализация — не Quicksort, тогда отсутствие хвостовой рекурсии — это тоже не Quicksort?
В статье, ссылку на которую я привёл, вообще описывается явный стек (nest). Существенным моментом здесь является не tail-call сам по себе, а гарантия лографмического размера — вполне алгоритмическая черта.
_DA>А переход на insertion sort для малых интервалов — это Quicksort или нет?
Это будет гибрид. Например часто в реализациях std::sort используется следующая схема: начинаем с quicksort, в середине можем перейти на heapsort (чтобы получить линеаритмический худший случай) и заканчиваем insertion sort — и для этого варианта есть специальное отдельное название — introsort.
_DA>Если Quicksort — это только то, что Хоар описал в 60-х, так она тогда на практике и не используется нигде (в модуле turbo pascal разве что..
Quicksort используется в гибридах типа introsort, которая используется в реализациях STL, потому что она действительно quick, как раз из-за inplace'ности и unguarded bidirectional partition — то чего нет в коде из первого сообщения.
_DA>а хотя стойте, там же нет хвостовой рекурсии ).
Причём тут "нет хвостовой рекурсии"? Она элементарно "эмулируется" вручную.
_DA>В целом, я за позицию wikipedia и Кормена et al.
Применение Lomuto partition для подобной сортировки — это крайне нерационально. Степанов объяснил почему — получается крайне неэффективно, так как намного чаще вырождается в квадратичность.
Для алгоритмического курса это действительно фейл.
В общем, я за то чтобы называть quicksort'ом только вариации близкие к оригинальной статье Хоара по двум причинам:
1) Сортировка называется quicksort — этот quick является неотъемлемой её частью.
2) Замечательный факт в том, что алгоритм шестидесятых годов, разрабатываемый под те железные реалии, остаётся крайне актуальным (действительно quick) и в наше время. И это как раз благодаря тем чертам, которых нет в коде из первого сообщения, и которые подробно описаны в оригинальной статье. Если же мы будем называть любую концептуально медленную вариацию этим именем — то связь с оригиналом действительно будет размываться.
Здравствуйте, Klapaucius, Вы писали:
EP>>Сильно другое количество сравнений/перестановок, другое количество проходов по памяти, принципиально другие точки разбиения — вполне веские причины чтобы не называть это quicksort'ом, IMO. EP>>Не говоря уже о другой сложности по памяти (обсуждаемой в другой ветке). K>Это ваше мнение находится в коренном противоречии со сложившейся практикой употребления названия quicksort. Впрочем, это уже ответили.
Я в курсе про "сложившуюся практику", и как уже сказал — против этого невежества. Оригинальный quicksort это inplace алгоритм (в смысле логарифмической гарантии на дополнительную память), это одно из главных необходимых свойств — в твоём варианте нет даже этого.
Тот же Erik Meijer открыто считает вопрос спорным, и не таким однозначным, иначе не делал бы дополнительные оговорки, ссылку выше приводил.
Мое мнение: не может, поскольку цель создания алгоритма — достижение результата с определенной затратой времени и памяти — здесь очевидно похерена. получилось нечто напомниающее карго-культ: вроде все похоже на настоящее, но не работает.
Здравствуйте, Буравчик, Вы писали:
Б>Наврядли удастся это сделать, пока не будет обозначено четкое определение quicksort
Более-менее чёткое определение выводится из оригинальной статьи. Inplace является одной из главных составляющих скорости сортировки.
Даже название нам указывает на то, что скорость является важным атрибутом этой сортировки.
Б>2. Сложность O(N*logN)
В оригинальном quicksort глубина стэка гарантированно логарифмическая.
Б>Есть конечно нюансы, но это вопрос реализации: Б>1. Для "настоящего" quicksort не нужна дополнительная память (in-place сортировка), но в Haskell такое понятие вообще не имеет смысла.
Есть монадические массивы с inplace модификацией. Вот пример того как это выглядит — уже не так радужно.
Б>Одновременно эти два условия и не соблюсти — stable in-place за O(N*logN) пока не придумали
Есть адаптивные stable сортировки на базе merge. Если доступен дополнительный объём памяти в "несколько процентов" от объёма входного массива — то сложность O(N*ln(N)). Если же нет (полностью inplace) то O(N*ln2(N)). Этот алгоритм подробно разбирает Александров Степанов в Elements of Programming, и он используется в реализациях std::stable_sort.
Б>И не забываем, что в Haskell сортируется список, т.е. структура с последовательным доступом (в отличии от массива)
Не просто последовательным, а ещё и однонаправленным. Более-менее нормальный quicksort можно реализовать для двунаправленных последовательностей.
Здравствуйте, _DAle_, Вы писали:
EP>>Помимо того что это не inplace (который был существенной частью оригинальной статьи), и как отметил Александреску тут совсем другой partition, тут ещё не используется приём дающий гарантию на логарифмичестий размер стека worst case, описанный в той же самой оригинальной статье шестидесятых годов. _DA>Можно цитату из оригинальной статьи дающую эту гарантию?
Вот статья Хоара 1962 года (там указывается что была статья и до этой — на ALGOL — но не суть).
Вторая страница, левая колонка, последний абзац:
It is important to know in advance the maximum number of locations used by nest; in order to ensure that the number of segments postponed at any one time never exceeds the logarithm (base 2) of the number of items to be sorted, it is sufficient to adopt the rule of always postponing the processing of larger of of the two segments.
Стек он называет nest'ом.
_DA>В wikipedia это называется Sedgewick variation.
Б>Это устраняет проблему выбора первого элемента — как и в оригинале теперь выбирается средний элемент. Сложность алгоритма остается та же O(N*logN) Б>Правда теряется устойчивость сортировки (хотя это можно исправить)
В этом варианте вообще теряется гарантия остановки — в нём нет loop variant. Простой контрпример — список эквивалентных элементов.
Нет. Где в операция обмена? Потому что, быстрая сортировка — это сортировка обменом. А всякие там "выборы опорных элементов" — это уже модификации сортировки обменом. Просто квиксорту повезло с модификацией, которая в среднем на случайных данных имеет сложность N log N. Но в худшем случая она такая же как и пузырьковая сортировка.
Данная реализация это какой симбиоз сортировки слиянием и выбором.
Здравствуйте, Basil B, Вы писали:
BB>Предлагаю обменяться мнениями по поводу того, имеет ли право этот "знаменитый двустрочник" на хаскеле называться quicksort-ом, и почему: BB>
BB>qsort [] = []
BB>qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]
BB>
Даже если отбросить inplace, pivot, log stack size — всё равно здесь есть существенное алгоритмическое отличие от оригинального quicksort.
В оригинальном quicksort разбиение происходит с обоих концов диапазона, причём используются предикаты x <= pivot и x >= pivot — то есть значения равные pivot могут как в правой так и в левой части. Это например позволяет оптимально делить массивы (либо под-массивы) состоящие из одинаковых элементов. То есть вырождение в квадратичность происходит в меньшем классе случаев.
Чтобы достичь подобных характеристик через фильтры — придётся разбивать на три части <x, ==x, >x.
Здравствуйте, Basil B, Вы писали:
BB>Предлагаю обменяться мнениями по поводу того, имеет ли право этот "знаменитый двустрочник" на хаскеле называться quicksort-ом, и почему: BB>
BB>qsort [] = []
BB>qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]
BB>
Наврядли удастся это сделать, пока не будет обозначено четкое определение quicksort
А вообще,
1. Pivot выбран, список разделен относительно pivot, рекурсия для каждого куска
2. Сложность O(N*logN)
В общем ДА, это quicksort
Есть конечно нюансы, но это вопрос реализации:
1. Для "настоящего" quicksort не нужна дополнительная память (in-place сортировка), но в Haskell такое понятие вообще не имеет смысла.
2. В haskell-версии эта сортировка является еще и устойчивой (stable), в отличии от "оригинала",
Одновременно эти два условия и не соблюсти — stable in-place за O(N*logN) пока не придумали
И не забываем, что в Haskell сортируется список, т.е. структура с последовательным доступом (в отличии от массива)
Б>2. В haskell-версии эта сортировка является еще и устойчивой (stable), в отличии от "оригинала", Б>Одновременно эти два условия и не соблюсти — stable in-place за O(N*logN) пока не придумали
У Кнута же был inplace merge sort, если ничего не забыл. Тынц раз, тынц два.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Помимо того что это не inplace (который был существенной частью оригинальной статьи), и как отметил Александреску тут совсем другой partition, тут ещё не используется приём дающий гарантию на логарифмичестий размер стека worst case, описанный в той же самой оригинальной статье шестидесятых годов.
Это устраняет проблему выбора первого элемента — как и в оригинале теперь выбирается средний элемент. Сложность алгоритма остается та же O(N*logN)
Правда теряется устойчивость сортировки (хотя это можно исправить)
Здравствуйте, Буравчик, Вы писали:
Б>Это устраняет проблему выбора первого элемента — как и в оригинале теперь выбирается средний элемент. Сложность алгоритма остается та же O(N*logN)
Обычно, когда говорят о сложности, то говорят о сложности в худшем случае. У любого quicksort сложность в худшем случае не O(N * logN).
Здравствуйте, _DAle_, Вы писали:
_DA>Здравствуйте, Буравчик, Вы писали:
Б>>Это устраняет проблему выбора первого элемента — как и в оригинале теперь выбирается средний элемент. Сложность алгоритма остается та же O(N*logN) _DA>Обычно, когда говорят о сложности, то говорят о сложности в худшем случае. У любого quicksort сложность в худшем случае не O(N * logN).
Речь была про то, что когда выбираешь первый элемент в качестве опорного, то это среднее N*logN превращается в худшее N^2 на частично отсортированных данных (коих большинство). Я показал, что эту проблему легко исправить в qsort.
Здравствуйте, Basil B, Вы писали:
BB>Предлагаю обменяться мнениями по поводу того, имеет ли право этот "знаменитый двустрочник" на хаскеле называться quicksort-ом, и почему:
Я считаю, что можно. Главный признак quicksort — это divide and conquer с выбором разделяющего элемента. Конечно, Хоар в свое время придумал не совсем это, но сейчас при всем множестве возможных реализаций quicksort, мне кажется, что и эту реализацию можно так назвать. Да, реализация неэффективная, да с объемом памяти все плохо, но принцип работы тот же.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Помимо того что это не inplace (который был существенной частью оригинальной статьи), и как отметил Александреску тут совсем другой partition, тут ещё не используется приём дающий гарантию на логарифмичестий размер стека worst case, описанный в той же самой оригинальной статье шестидесятых годов.
Можно цитату из оригинальной статьи дающую эту гарантию? В wikipedia это называется Sedgewick variation.
Здравствуйте, Basil B, Вы писали:
BB>Предлагаю обменяться мнениями по поводу того, имеет ли право этот "знаменитый двустрочник" на хаскеле называться quicksort-ом
Называться — конечно имеет, ибо "алгоритм" есть набор высокоуровневых операций. Делим список элементом, сортируем его подсписки — это и есть суть quicksort.
Другой вопрос, что это всё равно хаскелю не поможет — он уже много лет пытается корчить из себя элиту, как бомж в пиджаке "Армани". "Интеллектуальная обочина ИТ", я бы сказал.
При нынешнем развитии императивных языков (когда распараллеливание делается в два клика), вообще нет никакого смысла в функциональщине — за неё и цеплялись только из-за того, что "всё параллелится". Увы, в десктопном софте мало где нужны/полезны десятки параллельных трэдов. Ну так зачем опять раскапывать стюардессу??
Здравствуйте, _DAle_, Вы писали:
EP>>Вот на этом этапе алгоритм деления должен быть вполне конкретным — Hoare's partition. _DA>Кому должен? Вот у Кормена, например, используется Lomuto partition,
Это их фейл.
Даже Степанов этот момент упоминал, конкретно Lomuto vs Hoare partition в CLRS (34:18): https://youtu.be/d4tFGtGngf4?t=2058
ЕМНИП даже кто-то из CLRS это в своей лекции что-то такое упоминал.
_DA>и что это теперь не Quicksort, а другой алгоритм?
Да, другой алгоритм, с другой сложностью (абсолютной, не асимптотической), с другими скоростными характеристиками.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Это их фейл. EP>Даже Степанов этот момент упоминал, конкретно Lomuto vs Hoare partition в CLRS (34:18): EP>https://youtu.be/d4tFGtGngf4?t=2058 EP>ЕМНИП даже кто-то из CLRS это в своей лекции что-то такое упоминал.
Окей. Я не согласен. Я считаю, что тот конкретный алгоритм, который когда-то описал Хоар — это одна из реализаций того, что сейчас называется Quicksort (а та конкретная называется сортировкой Хоара). На мой взгляд, сейчас (а не в прошлом веке) по термином Quicksort подразумевают семейство алгоритмов (например, в той же википедии это так), с конкретным подходом: divide and conquer + pivot, и вполне определенной временной сложностью по времени в среднем и худшем случае.
Если считать, что, например, Lomuto partition — это уже не Quicksort, не in-place реализация — не Quicksort, тогда отсутствие хвостовой рекурсии — это тоже не Quicksort? А переход на insertion sort для малых интервалов — это Quicksort или нет? Если Quicksort — это только то, что Хоар описал в 60-х, так она тогда на практике и не используется нигде (в модуле turbo pascal разве что.. а хотя стойте, там же нет хвостовой рекурсии ).
В целом, я за позицию wikipedia и Кормена et al.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>В статье, ссылку на которую я привёл, вообще описывается явный стек (nest). Существенным моментом здесь является не tail-call сам по себе, а гарантия лографмического размера — вполне алгоритмическая черта.
Quicksort, описанный во многих книжках по алгоритмике с O(n) памяти — это не Quicksort тогда, так? Ну и, конечно же, stable версии алгоритма тогда не существует.
EP>Применение Lomuto partition для подобной сортировки — это крайне нерационально. Степанов объяснил почему — получается крайне неэффективно, так как намного чаще вырождается в квадратичность.
Честно говоря, Степанов произнес там какую-то наивную речь. Типа не протестировали, не обратили внимание. Код с Lomuto partition имеет очевидные проблемы, это всем понятно (уж людям уровня авторов CLRS так точно). Так же, как и любая другая реализация Quicksort, каждая со своими проблемами, поэтому в нормальных библиотеках и используют introsort.
Здравствуйте, Basil B, Вы писали:
BB>Предлагаю обменяться мнениями по поводу того, имеет ли право этот "знаменитый двустрочник" на хаскеле называться quicksort-ом
Это скорее сортировка двоичным несбалансированным деревом.
Квиксорт на хаскеле выглядит, например, так:
import qualified Data.Vector.Generic as V
import qualified Data.Vector.Generic.Mutable as M
qsort :: (V.Vector v a, Ord a) => v a -> v a
qsort = V.modify go where
go xs | M.length xs < 2 = return ()
| otherwise = do
p <- M.read xs (M.length xs `div` 2)
j <- M.unstablePartition (< p) xs
let (l, pr) = M.splitAt j xs
k <- M.unstablePartition (== p) pr
go l; go $ M.drop k pr
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Klapaucius, Вы писали:
K>Квиксорт на хаскеле выглядит, например, так:
Ближе, но всё равно не то.
K>
K>import qualified Data.Vector.Generic as V
K>import qualified Data.Vector.Generic.Mutable as M
K>qsort :: (V.Vector v a, Ord a) => v a -> v a
K>qsort = V.modify go where
K> go xs | M.length xs < 2 = return ()
K> | otherwise = do
K> p <- M.read xs (M.length xs `div` 2)
K> j <- M.unstablePartition (< p) xs
K> let (l, pr) = M.splitAt j xs
K> k <- M.unstablePartition (== p) pr
K> go l; go $ M.drop k pr
K>
* здесь два разбиения на три класса эквивалентности <, ==, > (причём лучше было бы использовать сразу three-way partition, а-ля Dutch national flag problem). В оригинальном же quicksort одно разбиение, причём в левой части могут быть <= и в правой >= .
* здесь нет гарантии на логарифмическую глубину стэка, которая есть в оригинальном quicksort.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>* здесь два разбиения на три класса эквивалентности <, ==, > (причём лучше было бы использовать сразу three-way partition, а-ля Dutch national flag problem). В оригинальном же quicksort одно разбиение, причём в левой части могут быть <= и в правой >= .
Это все не делает обсуждаемый алгоритм "не квиксортом".
EP> гарантия на логарифмическую глубину стэка, которая есть в оригинальном quicksort.
Да ну? Правда что ли?
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, T4r4sB, Вы писали:
K>>>Mutable TB>>И кто мне тут про чистоту рассказывал?
K>Где вы тут увидели противоречие?
Ну чистота же это когда нет ничего мутабельного.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, Klapaucius, Вы писали:
EP>>* здесь два разбиения на три класса эквивалентности <, ==, > (причём лучше было бы использовать сразу three-way partition, а-ля Dutch national flag problem). В оригинальном же quicksort одно разбиение, причём в левой части могут быть <= и в правой >= . K>Это все не делает обсуждаемый алгоритм "не квиксортом".
Сильно другое количество сравнений/перестановок, другое количество проходов по памяти, принципиально другие точки разбиения — вполне веские причины чтобы не называть это quicksort'ом, IMO.
Не говоря уже о другой сложности по памяти (обсуждаемой в другой ветке).
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Сильно другое количество сравнений/перестановок,
Асимптотика не меняется.
EP>другое количество проходов по памяти,
Асимптотика не меняется.
EP>принципиально другие точки разбиения — вполне веские причины чтобы не называть это quicksort'ом, IMO.
Это никак не изменяет то, что в реальности различные модификации quicksort называют quicksort.
EP>Не говоря уже о другой сложности по памяти (обсуждаемой в другой ветке).
У меня есть пример Dijkstra's algorithm. Вообще, оригинальный алгоритм имел временную сложность O(V^2). Простой алгоритм, использующий приоритетную очередь, имеет сложность O(E*logV), и тоже называется алгоритмом Дейкстры. Алгоритм, где в качестве приоритетной очереди используется куча Фибоначчи, имеет сложность O(E+V*logV) и тем не менее эту реализацию тоже называют реализацией алгоритма Дейкстры. А в нашем споре у различных видов реализации сортировки абстрактный алгоритм тот же и сложность та же.
Здравствуйте, _DAle_, Вы писали:
EP>>Сильно другое количество сравнений/перестановок, _DA>Асимптотика не меняется. EP>>другое количество проходов по памяти, _DA>Асимптотика не меняется.
Одинаковая асимптотическая сложность не является достаточным условием. Количество операций тоже имеет значение.
Конкретный пример: hoare_partition vs lomuto_partition — асимптотическая сложность одинаковая, а количество операций разное
EP>>принципиально другие точки разбиения — вполне веские причины чтобы не называть это quicksort'ом, IMO. _DA>Это никак не изменяет то, что в реальности различные модификации quicksort называют quicksort.
Вот я как раз против этого невежества. Оригинальный quicksort имеет куда лучшие характеристики чем поделки называемые его именем.
EP>>Не говоря уже о другой сложности по памяти (обсуждаемой в другой ветке). _DA>У меня есть пример Dijkstra's algorithm. Вообще, оригинальный алгоритм имел временную сложность O(V^2). Простой алгоритм, использующий приоритетную очередь, имеет сложность O(E*logV), и тоже называется алгоритмом Дейкстры. Алгоритм, где в качестве приоритетной очереди используется куча Фибоначчи, имеет сложность O(E+V*logV) и тем не менее эту реализацию тоже называют реализацией алгоритма Дейкстры.
Надо смотреть оригинальную статью Дейкстры.
В любом случае, я не против того чтобы улучшенный алгоритм называли именем автора.
Я против того чтобы изуродованную версию, с намного худшими характеристиками (см. первое сообщение темы), принципиально противоречащими изначальной концепции заложенной автором (quicksort же) называли оригинальным именем.
_DA>А в нашем споре у различных видов реализации сортировки абстрактный алгоритм тот же и сложность та же.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Сильно другое количество сравнений/перестановок, другое количество проходов по памяти, принципиально другие точки разбиения — вполне веские причины чтобы не называть это quicksort'ом, IMO. EP>Не говоря уже о другой сложности по памяти (обсуждаемой в другой ветке).
Это ваше мнение находится в коренном противоречии со сложившейся практикой употребления названия quicksort. Впрочем, это уже ответили.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll