【发布时间】:2015-03-08 02:45:20
【问题描述】:
quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) =
let smallerOrEqual = [a | a <- xs, a <= x]
larger = [a | a <- xs, a > x]
in quicksort smallerOrEqual ++ [x] ++ larger
main = do
let a = [ 5, 1, 9, 4, 6, 7, 3]
print $ quicksort a
在 Haskell 快速排序中,为什么第一个 let 使用 <= 而不是 <?我认为<= 会重复x 很多次。为什么不呢?
【问题讨论】:
-
因为它试图稳定。
-
如果您使用
<而不是<=,则生成的列表将是原始列表的升序版本但删除了所有重复项。然而,消除欺骗并不是排序的目的。 -
@Jubobs 但是,它是否继续包含“x”?我不明白那部分。如何每次摆脱一个。
-
@BufBills 不知道你的意思...严格来说,排序不是丢掉骗子;结果列表应该只是您传递给
quicksort的列表的排序版本;这两个列表应该具有相同的长度。顺便说一句,你错过了一个函数调用;应该是quicksort smallerOrEqual ++ [x] ++ quicksort larger -
感谢朱博斯。我明白了!