packages feed

swish-0.2.1: Swish/HaskellRDF/Sort/AdaptiveHeapSort.lhs

%-------------------------------=  --------------------------------------------
\section{Adaptive heap sort}
%-------------------------------=  --------------------------------------------

%include CartesianTree.lhs

%- - - - - - - - - - - - - - - -=  - - - - - - - - - - - - - - - - - - - - - -
\subsection{Adaptive heap sort}
%- - - - - - - - - - - - - - - -=  - - - - - - - - - - - - - - - - - - - - - -

%align

> module Swish.HaskellRDF.Sort.AdaptiveHeapSort
> where
> import Swish.HaskellRDF.Sort.LibBase
> import Swish.HaskellRDF.Sort.CartesianTree (BinTree(..), cartesianTree)
> import Swish.HaskellRDF.Sort.HeapSort (Heap(..), leaf, insertBy)
> import Swish.HaskellRDF.Sort.BraunHeap (siftBy, joinBy)

%align 33

> adaptiveHeapSort		:: (Ord a) => [a] -> [a]
> adaptiveHeapSort		=  adaptiveHeapSortBy (<=)

> adaptiveHeapSortBy (<=) as	=  unheap (leaf (cartesianTree as))
>   where
>
>   Leaf      <== _		=  True
>   Node _ a _ <== Node _ b _	=  a <= b
>   Node _ _ _ <== _		=  False

>   unheap Empty		=  []
>   unheap (Bin t hl hr)	=  case t of
>       Node Leaf a Leaf	-> a : unheap (joinBy (<==) hl hr)
>       Node l a Leaf		-> a : unheap (siftBy (<==) l hl hr)
>       Node Leaf a r		-> a : unheap (siftBy (<==) r hl hr)
>       Node l a r		-> a : unheap (insertBy (<==) r $ siftBy (<==) l hl hr)