Below is my current code that sorts a list in acesending order:
qsort::[Int]->[Int]
qsort[]=[]
qsort(x:xs)
=qsort[y|y<-xs, y<=x] [x] qsort[y|y<-xs,y>x]
How would i modify/create a function that sorts a list such as:
[("Bob",22),("Peter",38),("Charlie",19)]
by the int value
CodePudding user response:
You can unpack the items in 2-tuples:
qsort::[Int] -> [Int]
qsort [] = []
qsort(x@(_,vx):xs) = qsort [ y | y@(_, vy) <-xs, … ] [x] qsort [ y | y@(_, vy) <- xs, … ]
Here you still need to fill in the …
parts. The vx
is the value of x
, and vy
is the value of the elements y
. You thus will need to make comparisons between vx
and vy
.
CodePudding user response:
Here's a possible strategy. First, define a custom "less than or equal to" operator
lte :: (String, Int) -> (String, Int) -> Bool
lte (str1, int1) (str2, int2) = ...
Then, adapt your qsort
implementation replacing each use of <=
with a call to lte
, and each use of >
with the negation of a call to lte
.
CodePudding user response:
for ascending
test = sortBy (compare `on` snd) [("Bob",22),("Peter",38),("Charlie",19)]
for descending
test = sortBy (flip compare `on` snd) [("Bob",22),("Peter",38),("Charlie",19)]
alternatively descending,
import Data.Function (on)
import Data.Ord (Down(Down))
test = sortOn Down [("Bob",22),("Peter",38),("Charlie",19)]