kb 16.10.2012 09:09 04a3831c

То ли я чего-то не понимаю, но почему всякие хаскели и скалы пишут квиксорт примерно таким образом?

def sortList(list: List[Int]): List[Int] = list match {
case Nil => Nil
case head :: tail => sortList(tail.filter(_ < head)) ::: head :: sortList(tail.filter(_ >= head))
}

В смысле, разве этот .filter() будет проходить не два раза по одному и тому же списку? Разве не правильнее сделать какой-нибудь split, возвращающий тупл из элементов "больше" и "меньше", и тут уже правильно их распихать?

Ну и вообще надо бы поисследовать что еще там такого, что тормозит https://jazzy.id.au/default/2012/10/16/b...

fp
1. gds 16.10.2012 09:32

будет два раза, да. Да и вообще, это не quicksort, так как quicksort — конкретный алгоритм, определённый на массивах с доступом к элементу за O(1). А не эта срань.

2. kbgds /1 16.10.2012 09:38

и да, под "split" я имел в виду Data.List.span (в случае с х-лем)

3. kbgds /1 16.10.2012 09:40

а я вот не знаю, где там доступ к элементу на O(1) нужен, кроме первоначального выбора pivot'а (который здесь тоже хитро берется тупо первым).

4. gdskb /3 16.10.2012 09:41

а собственно перестановка элементов относительно пивота?

5. kbgds /4 16.10.2012 09:47

да, что-то я тупой сейчас.

6. hirthwork 16.10.2012 09:49 mcabberD66F0D1F

так квиксорт пишут исключительно для захвата внимания человека, открывшего страничку почитать наискосок. всем же приятно написать квиксорт в одну строчку. вот и хуярят этот стандартный пример. но если у автора есть хоть немного совести (как у Joe Armstrong'а) то на следующих десяти страницах он объясняет, что приведённый пример говно и рассказывает как это надо делать правильно.

7. kbhirthwork /6 16.10.2012 09:53

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

8. hirthworkkb /7 16.10.2012 09:56 mcabberD66F0D1F

не могу не запостить сюда:

9. kbhirthwork /8 16.10.2012 10:06

ну, кстати, если серьезно — то нужно взять и уеб^^^ переписать (чтоб по честному) так, чтоб состояние (а именно, весь массив) передавалось в виде хвостовой рекурсии. что в лиспах, что в х-лях всяких. но получится такое нечитаемое говно что аж страшно представить (вместе с счетчиком "перестановки" и т.п.).

p.s.: надо будет попробовать, что ли.

10. hirthworkkb /9 16.10.2012 10:07 mcabberD66F0D1F

чего только люди не «пробуют», лишь бы на плюсах не писать

11. kbhirthwork /10 16.10.2012 10:14

на плюсах писать пробовал. как-нибудь еще попробую обязательно.

12. kbkb /11 16.10.2012 10:14

но это ведь не будет так же весело, а другой цели у меня особо и нету.

13. hirthworkkb /12 16.10.2012 10:15 mcabber914DAB0B

на плюсах писать не весело? да ты метапрограмминг, похоже, не осилил. там же функциональщина чистой воды

14. 0xd34df00dhirthwork /13 16.10.2012 10:16 Azoth_primary

Поддвачиваю этого баттхертворка.

15. gdskb /12 16.10.2012 10:16

только рекомендую тщательно делить код на "весело" и "для реального использования". quicksort на списках — это может и весело (хотя, как по мне, так печально), но в реальное использование не рекомендую.

16. DZhon0xd34df00d /14 16.10.2012 10:17 STARGATE

MPL-страпончика всей компашке

17. kbgds /15 16.10.2012 10:26

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

18. kbhirthwork /13 16.10.2012 10:27

зачем если есть функциональщина? впрочем, глупый спор.

19. kbkb /18 16.10.2012 10:27

> глупый спор
> psto.net

20. 0xd34df00dkb /18 16.10.2012 10:27 Azoth_primary

Тому, кто никогда не пердолился в Boost.MPL, Spirit и прочих няшек, не понять.

21. hirthwork0xd34df00d /20 16.10.2012 10:27 mcabber914DAB0B

о да, детка. компилируй меня полностью

22. DZhon0xd34df00d /20 16.10.2012 10:28 STARGATE

У меня есть некоторые сомнения относительно того, что няшкой можно считать такие, пусть и гениальные, но ОЧЕНЬ вербозные штуки.

23. hirthworkDZhon /22 16.10.2012 10:28 mcabber914DAB0B

Boost.MPL норм. не очень-то и вербозно

24. 0xd34df00dDZhon /22 16.10.2012 10:29 Azoth_primary

Хуле тут вербозного? https://github.com/0xd34df00d/leechcraft...

25. DZhonhirthwork /23 16.10.2012 10:29 STARGATE

Я больше к спириту претенизю предъявляю.

26. DZhon0xd34df00d /24 16.10.2012 10:32 STARGATE

На тех же литералах из С++11, наверное, было бы лаконичней реализовано.

27. kbgds /4 16.10.2012 11:09

нет, всё же, не понял. перестановка там только в случае "in place" варианта делается. в остальных же строятся новые списки / массивы.

28. gdskb /27 16.10.2012 13:54

ну вот, остальные варианты и не являются quicksort.

Do you really want to delete ?