首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell快速排序效率

Haskell快速排序效率
EN

Stack Overflow用户
提问于 2014-04-27 03:10:51
回答 1查看 976关注 0票数 2

下面是一个学习Haskell的例子:

代码语言:javascript
复制
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

对于每个递归,似乎每个列表迭代两次,对于每个列表理解,迭代一次。对此进行优化的编译器有什么神奇之处吗?如果没有,如何解决这个问题?

编辑:我不在乎这是否是一个真正的快速。忽略快速排序。我的问题是关于两个列表理解的效率,以及如何修改这个特定的算法(快速排序或不修改),以避免每次递归迭代xs两次。

EN

回答 1

Stack Overflow用户

发布于 2014-04-27 13:45:49

不是的。到目前为止,GHC7.8.2还不够聪明,无法从上面的quicksort定义中找到聪明的就地快速排序算法。通过定义quicksort,您可以在一次传递中执行相同的操作

代码语言:javascript
复制
import Data.List (partition)
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = let (psx1, psx2, psx3) = partition3 x (x:xs) in
                   quicksort psx1 ++ psx2 ++ quicksort psx3

partition3 _ [] = ([], [], [])
partition3 a (x:xs)
    | a == x = (pxs1, x:pxs2, pxs3)
    | a < x = (pxs1, pxs2, x:pxs3)
    | a > x = (x:pxs1, pxs2, pxs3)
    where (pxs1, pxs2, pxs3) = partition3 a xs

但是您应该检查is it possible to do quicksort of a list with only one passing?,因为它比上面的版本更有效。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23318948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档