Definition of merge
and mergeSort
. #
These definitions are intended for verification purposes,
and are replaced at runtime by efficient versions in Init.Data.List.Sort.Impl
.
Merges two lists, using le
to select the first element of the resulting list if both are
non-empty.
If both input lists are sorted according to le
, then the resulting list is also sorted according
to le
. O(min |l| |r|)
.
This implementation is not tail-recursive, but it is replaced at runtime by a proven-equivalent tail-recursive merge.
Equations
Instances For
Split a list in two equal parts. If the length is odd, the first part will be one element longer.
This is an implementation detail of mergeSort
.
Equations
- List.MergeSort.Internal.splitInTwo l = (⟨(List.splitAt ((n + 1) / 2) l.val).fst, ⋯⟩, ⟨(List.splitAt ((n + 1) / 2) l.val).snd, ⋯⟩)
Instances For
A stable merge sort.
This function is a simplified implementation that's designed to be easy to reason about, rather than
for efficiency. In particular, it uses the non-tail-recursive List.merge
function and traverses
lists unnecessarily.
It is replaced at runtime by an efficient implementation that has been proven to be equivalent.
Equations
Instances For
Given an ordering relation le : α → α → Bool
,
construct the lexicographic ordering on α × Nat
.
which first compares the first components using le
,
but if these are equivalent (in the sense le a.2 b.2 && le b.2 a.2
)
then compares the second components using ≤
.
This function is only used in stating the stability properties of mergeSort
.