< Я думаю = дублирует что х много раз
Нет, это не будет. Давайте поймем, что именно происходит здесь. Вы в основном разбиваете свой список на три части.
Список чисел, меньших или равных поворотного элемента (за исключением первого элемента, так что поворотный элемент)
Сам (первый элемент в списке) поворотный элемент
Список номеров больше, чем поворотного элемента
Таким образом, в вашем случае, распределяли список становится так
[1, 4, 3] ++ [5] ++ [9, 6, 7]
Рассмотрите такой случай, quicksort [5, 1, 5, 9, 8, 5, 3, 6, 4]
. Затем, ваша программа будет разделить его на что-то вроде этого
smallerOrEqual ++ [x] ++ larger
smallerOrEqual
Так и larger
работы с xs
, которые не имеют x
, нет никакого дублирования как таковой. Теперь секционированный список после фильтрации становится
[1, 5, 5, 3, 4] ++ [5] ++ [9, 8, 6]
См.? Нет дублирования, просто разделение.
Примечание: У вашей программы серьезная ошибка. Проверьте эту линию
quicksort smallerOrEqual ++ [x] ++ larger
Это в основном работает как этот
(quicksort smallerOrEqual) ++ [x] ++ larger
Итак, то larger
список никогда не отсортирован. Вы рекурсивно должны сортировать как меньший список, так и больший список и, наконец, объединить их в один. Таким образом, это должно было быть
(quicksort smallerOrEqual) ++ [x] ++ (quicksort larger)
, которые могут быть записаны без скобок, как этот
quicksort smallerOrEqual ++ [x] ++ quicksort larger
Потому что он пытается быть стабильным. – Ra1nWarden
Если вы используете '<' вместо '<=', результирующий список будет восходящей версией исходного списка *, но при удалении всех дубликатов *. Однако удаление обманов - это не то, что сортировка. – Jubobs
@Jubobs но, он держит в том числе «х»? Я не получаю эту часть. Как избавиться от них каждый раз. – BufBills