Я вот что сложно сделать стабильной быстрой сортировкой. Однако моя быстрая сортировка кажется стабильной.
quicksortBy _ []=[]
quicksortBy key (pivot:rest)=
(quicksortBy key [little|little<-rest, key little < key pivot])
++ [pivot] ++
(quicksortBy key [big|big<-rest, key big >= key pivot])
Затем я делаю:
*Main> let items = [(4,0),(1,1),(10,2),(6,3),(4,4),(6,5), (1,6)]
*Main> quicksortBy fst items
[(1,1),(1,6),(4,0),(4,4),(6,3),(6,5),(10,2)]
Используя первый элемент в качестве опорного, дубликаты перемещаются вправо. Это неправильно, или люди не используют это, так как это неэффективно для отсортированных данных. Или я открыл для себя что-то новое?