How to resolve the algorithm Sorting algorithms/Patience sort step by step in the Haskell programming language
How to resolve the algorithm Sorting algorithms/Patience sort step by step in the Haskell programming language
Table of Contents
Problem Statement
Sort an array of numbers (of any convenient size) into ascending order using Patience sorting.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Sorting algorithms/Patience sort step by step in the Haskell programming language
The provided Haskell code implements the Patience Sorting algorithm, which is used to sort a list of elements in ascending order. The algorithm works by repeatedly merging sorted sublists (piles) until a single sorted list is obtained.
Here's a breakdown of the code:
-
Data Structures:
Pile a
: Represents a pile of elements of typea
. It is essentially a list wrapped in a custom data type.ST
: Monad for managing stateful computations.
-
Instance Definitions:
Eq a => Eq (Pile a)
andOrd a => Ord (Pile a)
: Define equality and ordering for piles based on the elements they contain.
-
patienceSort
Function:- Main entry point for the sorting algorithm.
- Sorts the input list using
sortIntoPiles
to create piles of sorted sublists, then merges the piles usingmergePiles
.
-
sortIntoPiles
Function:- Uses state monads (
ST
) to create a dynamic array of piles (piles
). - Implements a binary search algorithm (
bsearchPiles
) to efficiently insert each element into the correct pile based on its value. - Returns a list of piles, with each pile containing sorted elements.
- Uses state monads (
-
mergePiles
Function:- Takes a list of sorted piles.
- Uses unfoldr and a priority queue (
S.fromList . map Pile
) to iteratively merge the piles, starting with the pile containing the smallest element. - Returns a single sorted list by merging the piles in ascending order.
-
main
Function:- Calls
patienceSort
with a sample input list and prints the sorted result.
- Calls
In summary, this code implements the Patience Sorting algorithm, which is a stable sorting algorithm that works by repeatedly merging sorted sublists until a single sorted list is obtained. It uses state monads and a custom pile data structure to efficiently manage the sorting process.
Source code in the haskell programming language
import Control.Monad.ST
import Control.Monad
import Data.Array.ST
import Data.List
import qualified Data.Set as S
newtype Pile a = Pile [a]
instance Eq a => Eq (Pile a) where
Pile (x:_) == Pile (y:_) = x == y
instance Ord a => Ord (Pile a) where
Pile (x:_) `compare` Pile (y:_) = x `compare` y
patienceSort :: Ord a => [a] -> [a]
patienceSort = mergePiles . sortIntoPiles where
sortIntoPiles :: Ord a => [a] -> [[a]]
sortIntoPiles lst = runST $ do
piles <- newSTArray (1, length lst) []
let bsearchPiles x len = aux 1 len where
aux lo hi | lo > hi = return lo
| otherwise = do
let mid = (lo + hi) `div` 2
m <- readArray piles mid
if head m < x then
aux (mid+1) hi
else
aux lo (mid-1)
f len x = do
i <- bsearchPiles x len
writeArray piles i . (x:) =<< readArray piles i
return $ if i == len+1 then len+1 else len
len <- foldM f 0 lst
e <- getElems piles
return $ take len e
where newSTArray :: Ix i => (i,i) -> e -> ST s (STArray s i e)
newSTArray = newArray
mergePiles :: Ord a => [[a]] -> [a]
mergePiles = unfoldr f . S.fromList . map Pile where
f pq = case S.minView pq of
Nothing -> Nothing
Just (Pile [x], pq') -> Just (x, pq')
Just (Pile (x:xs), pq') -> Just (x, S.insert (Pile xs) pq')
main :: IO ()
main = print $ patienceSort [4, 65, 2, -31, 0, 99, 83, 782, 1]
You may also check:How to resolve the algorithm State name puzzle step by step in the Scala programming language
You may also check:How to resolve the algorithm O'Halloran numbers step by step in the Python programming language
You may also check:How to resolve the algorithm Sorting algorithms/Merge sort step by step in the Quackery programming language
You may also check:How to resolve the algorithm Bulls and cows step by step in the FutureBasic programming language
You may also check:How to resolve the algorithm Loop over multiple arrays simultaneously step by step in the Ada programming language