根据给定标准进行快速排序Haskell [重复]

问题描述 投票:0回答:1

我有一个要求:

让我们考虑字符串之间的以下排序关系:s1小于s2如果s1短于s2或它们具有相同的长度并且s1在字典上更小比s2。用两个参数x和y编写一个名为ltstr的函数,该函数实现此顺序关系。编写一个获得2个参数的函数qs:一个列表和一个排序标准,然后对使用快速排序算法,根据给定的标准给出列表。例如:

Main> qs ["Russia","Norway","Germany","Romania", "France","Antigua and Barbuda","South Korea","Angola","Hungary"] ltstr
["Angola","France","Norway","Russia","Germany","Hungary","Romania","South Korea","Antigua and Barbuda"]

我不确定如何在Haskell中准确地传递函数作为参数。这是代码框架

\begin{code}
 ltstr s1 s2 = if length(s1) < length(s2) then s1
               else if length(s1) == length (s2) && s1 < s2  then s1  
                     else s2

 qs (l:ls) crit = (qs smalls crit) ++ [l] ++ (qs biggs crit) 
                  where                    
                  smalls = [ s | s <- ls, (crit s l) == s]
                  biggs = [ b | b <- ls, (crit b l) == l]    

\end{code}
haskell recursion functional-programming criteria quicksort
1个回答
0
投票
现在,此要求与排序算法无关。它只是乞求Ordering类型的Monoid实例。

只要您做对了,就可以简单地通过Data.List.sortBy :: (a -> a -> Ordering) -> [a] -> [a]完成。

Data.List.sortBy :: (a -> a -> Ordering) -> [a] -> [a]

事物是sortByLengthThenLex :: [String] -> [String]
sortByLengthThenLex = sortBy compareLengthThenLex
                      where
                      compareLengthThenLex :: String -> String -> Ordering
                      compareLengthThenLex x y = (length x `compare` length y) <> (x `compare` y)
类型的Monoid实例的定义,例如

Ordering

如果比较的左手边获得优先权,除非它们相等。

相应地

instance Monoid Ordering where mempty = EQ LT `mappend` _ = LT EQ `mappend` y = y GT `mappend` _ = GT

注意:您可以将λ> sortByLengthAndLex ["Russia","Norway","Germany","Romania", "France","Antigua and Barbuda","South Korea","Angola","Hungary","USA","UK"]
["UK","USA","Angola","France","Norway","Russia","Germany","Hungary","Romania","South Korea","Antigua and Barbuda"]
运算符视为<>的默认前缀版本。
© www.soinside.com 2019 - 2024. All rights reserved.