如何排序' HOHOHOO !!!'在Haskell中使用任何非比较整数排序算法?

时间:2015-01-04 17:43:23

标签: algorithm sorting haskell

我正在尝试排序' HOHOHOO !!!'在Haskell中使用任何非比较整数排序算法,以便最终得到' !!! HHHOOOO' ..

我只和Haskell串在一起并且整天坐在它上面...请帮助!

到目前为止我得到的只是这个,但它不允许对信件进行排序。我想我需要使用Radix排序,但我不知道如何。

merge [] l = l
merge l [] = l
merge l1@(x1:r1) l2@(x2:r2) =
if x1 < x2 then x1:(merge r1 l2) else x2:(merge l1 r2)

ssort [] = []
ssort l = merge strand (ssort rest)
where (strand, rest) = foldr extend ([],[]) l
      extend x ([],r) = ([x],r)
      extend x (s:ss,r) = if x <= s then (x:s:ss,r) else (s:ss,x:r)

谢谢你, 大沙

1 个答案:

答案 0 :(得分:4)

在Haskell中,计数排序是非比较性的,非常简单(单行!):

import Data.Array

countingSort :: (Bounded a, Ix a, Num i) => [a] -> Array a i
countingSort = accumArray (+) 0 (minBound, maxBound) . flip zip (repeat 1)

基数排序可以使用类似的技术实现,使用数据结构来实现基数查找。有关排序Int的信息,请参阅IntMap,或浏览可处理其他类型数据的接口的许多memoization包。