haskell快速排序复杂性?

时间:2016-04-21 20:08:34

标签: algorithm sorting haskell time-complexity

我运行以下快速排序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. 如何使用其复杂性预测算法的运行时间?

1 个答案:

答案 0 :(得分:7)

快速排序的最坏情况时间是 n 2 。您的实现使用第一个元素作为数据透视表,当输入被排序(或反向排序)时,这会导致最坏情况下的性能。

要快速执行 n log n 的预期复杂性,您需要随机选择枢轴,或者在排序之前随机调整输入。