如何按身高升序对(String, Int)类型的Horse二元组列表快速排序?
Haskell按马匹身高升序快速排序的正确实现
你的代码问题在于缺少quick_sort函数的实现,且参数传递方式不符合Haskell的语法要求。以下是两种可行的实现方案:
方案一:手动实现通用快速排序
先定义一个通用的快速排序函数,接收比较逻辑和待排序列表,再针对马匹身高的排序需求调用该函数:
type Horse = (String, Int) -- 通用快速排序:参数为比较函数、待排序列表 quickSort :: (a -> a -> Bool) -> [a] -> [a] quickSort _ [] = [] -- 空列表直接返回 quickSort cmp (pivot:rest) = -- 拆分列表:小于等于基准的元素、大于基准的元素 let smallerOrEqual = filter (\x -> cmp x pivot) rest larger = filter (\x -> not (cmp x pivot)) rest -- 递归排序后拼接结果 in quickSort cmp smallerOrEqual ++ [pivot] ++ quickSort cmp larger -- 按马匹身高升序排序的专用函数 sortHorseList :: [Horse] -> [Horse] sortHorseList = quickSort (\h1 h2 -> snd h1 <= snd h2)
测试示例:
-- 输入 sortHorseList [("Thunder",125),("Lightning",115),("Bolt",135)] -- 输出 [("Lightning",115),("Thunder",125),("Bolt",135)]
方案二:使用Haskell标准库(更简洁高效)
Haskell标准库提供了sortBy函数,结合comparing可以快速实现基于特定字段的排序,无需手动编写快速排序逻辑:
import Data.List (sortBy) import Data.Ord (comparing) type Horse = (String, Int) sortHorseList :: [Horse] -> [Horse] sortHorseList = sortBy (comparing snd)
这个方案的优势在于标准库的排序函数经过优化,在性能和边界情况(如空列表、重复身高的马匹)处理上更可靠。
内容的提问来源于stack exchange,提问作者Thomas Butler
相关产品推荐
相关产品推荐

