通过比较双精度的总和来排序

Sort by comparing the sum of a double

maxSumPair :: [(Int,Int)] -> (Int,Int)
maxSumPair l = head $ sortBy (comparing auxSum) l

auxSum :: (Int,Int) -> Int
auxSum (a,b) = a+b

使用函数 maxSumPair,我想计算哪个双打的总和最大。

例如,它应该是这样工作的:

> maxSumPairs [(1,10),(6,6),(10,1)] 
(6,6)

但是我的函数给出的是 (1,10) 而不是 (6,6)。我的错误是什么?

sortBy,默认情况下,稳定排序升序。因此,head 将得到最小的一对。相反,您可以将 auxSum 调整为 return 负和值以按降序对实际数据进行排序并获取头部,就像这样

auxSum :: (Int,Int) -> Int
auxSum (a,b) = -(a + b)

> maxSumPair [(1,10),(6,6),(10,1)] 
(6,6)

如果你不想改变auxSum,那么使用last函数代替head,像这样

auxSum :: (Int,Int) -> Int
auxSum (a,b) = a + b

maxSumPair :: [(Int,Int)] -> (Int,Int)
maxSumPair l = last $ sortBy (comparing auxSum) l

> maxSumPair [(1,10),(6,6),(10,1)] 
(6,6)

注意: 或者,您可以使用 maximumBy 函数,这对于这种情况非常有效(因为 sortBy 会 运行在 O(n * log n) 时间内,但 maximumBy 会在 O(n) 内完成,就像这样

auxSum :: (Int,Int) -> Int
auxSum (a,b) = a + b

> maximumBy (comparing auxSum) [(1,10),(6,6),(10,1)] 
(6,6)

补充一下,注意你可以通过翻转比较函数来进行反向排序:

reverseSort xs = sortBy (flip compare) xs
reverseSortBy cmp xs = sortBy (flip cmp) xs

所以你可以这样写:

maxSumPair xs = head $ sortBy (flip $ comparing auxSum) xs