我来自 C++ 背景,所以我不确定我是否能正确处理这个问题。但是我要做的是编写快速排序,但如果列表的长度小于某个阈值,则回退到插入排序。到目前为止,我有这个代码:
insertionSort :: (Ord a) => [a] -> [a]
insertionSort [] = []
insertionSort (x:xs) = insert x (insertionSort xs)
quickSort :: (Ord a) => [a] -> [a]
quickSort x = qsHelper x (length x)
qsHelper :: (Ord a) => [a] -> Int -> [a]
qsHelper [] _ = []
qsHelper (x:xs) n
| n <= 10 = insertionSort xs
| otherwise = qsHelper before (length before) ++ [x] ++ qsHelper after (length after)
where
before = [a | a <- xs, a < x]
after = [a | a <- xs, a >= x]
现在我关心的是每次计算每个列表的长度。我不完全理解 Haskell 如何优化事物或惰性评估对上述代码的完整影响。但似乎在列表理解之前和之后计算每个列表的长度不是一件好事?有没有办法让您在执行列表推导时提取列表推导中发生的匹配数?
即,如果我们有[x | x <- [1,2,3,4,5], x > 3]
(导致 [4,5])我可以在不使用长度调用的情况下获得 [4,5] 的计数吗?
感谢您的任何帮助/解释!