2016-04-21 2 views
4

я бег ниже быстрая сортировка функции Haskell (с помощью слияния и сортировки алгоритма):haskell быстрая сортировка сортировки?

qsort []=[] 
qsort (x:xs) = 
    qsort smaller ++ [x] ++ qsort larger 
    where 
     smaller = [a | a <- xs , a<x ] -- edit 
     larger = [b | b <- xs , b>=x ] 

Для проверки выполнения этого в течение битового большого количества данных, я запускаю код ниже:

qsort [100000,99999..0] 

До сих пор 40 минут, и он все еще работает! Даже список из 100 000 не так велик, поэтому:

  1. Как я могу обрабатывать данные в миллиард данных?
  2. это алгоритм сортировки (слияние и сортировка) занимает меньше времени на другом языке, таком как C#, python ... это проблема в языке haskell
  3. Как я мог предсказать время выполнения алгоритма с использованием его сложности?
+7

Первый элемент - ужасный выбор стержня. Кроме того, ваша дублирующаяся обработка абсолютно неверна; любые дубликаты стержня попадают в «меньшие» и «большие»! – user2357112

+3

Быстрая сортировка на месте! Это не быстрый вид. – dotctor

+0

Вам также необходимо убедиться, что * все * вхождения 'x' появляются в выводе, если это не уникальное значение. – chepner

ответ

7

Худшее время случай быстрой сортировки п. Ваша реализация использует первый элемент в качестве шарнира, что приводит к производительности в худшем случае, когда вход сортируется (или отсортирован в обратном порядке).

Чтобы получить быструю сортировку выполнить в ожидаемой сложности п журнала п, вам нужно либо рандомизированное выбор поворота, или в случайном порядке перетасовать вход перед сортировкой.

+0

Для сортировки используйте сортировку shuffle, затем отсортируйте сортировку сортированных сортов? –