algorithm - 以下快速排序的 Haskell 实现是否高效?

标签 algorithm haskell functional-programming quicksort

我在《Learn You Haskell》一书中找到了以下快速排序的实现。

quicksort :: (Ord a) => [a] -> [a]  
quicksort [] = []  
quicksort (x:xs) =   
    let smallerSorted = quicksort [a | a <- xs, a <= x]  
        biggerSorted = quicksort [a | a <- xs, a > x]  
    in  smallerSorted ++ [x] ++ biggerSorted  

我的问题是,鉴于此,这是否会降低快速排序的效率

  1. ++ 操作相当昂贵
  2. 列表推导式用于构造两个子列表?

最佳答案

对于算法点来说,它不是就地算法。因此,它不会像您所知道的传统命令式实现那样高效。 (就地是类似快速排序的排序算法卓越性能的一个关键方面。)

它将以快速排序的典型复杂性运行(平均 O(N * log(N)) 最坏情况 O(N²) )。因此,它是高效的,因为它能够根据输入进行扩展。但它不会像高度调整的实现那么快(例如,参见 this question )。

作为一个小调整,我记得替换了 [x] ++ biggerSorted通过(x:biggerSorted)稍微提高性能是一个容易实现的目标。那是很多年前的事了,所以也许今天的优化编译器可以自动进行低级优化。

关于algorithm - 以下快速排序的 Haskell 实现是否高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68517871/

相关文章:

sql - 查询以查找一个表中的行总和等于另一个表中的一个或多个行

haskell - 矩阵的第一列作为 Haskell 中的行列表给出

带有自定义失败的 Haskell State monad

python - Python脚本中数组数据转换的设计模式

functional-programming - writer monad 和 list writer monad 有什么区别

algorithm - 如何将大小相等的正方形网格减少为最少的矩形集?

java - Java 中的二重积分和期望值蒙特卡洛方法

java - 我计算非常大的斐波那契数模的算法太慢了

haskell - 为什么我的类型最后有 '-> Constraint' ?

haskell - 获取终端宽度 Haskell