Defines `mergeSort`, a naive stable merge sort algorithm, replaces it via a `@[csimp]` lemma with something faster at runtime, and proves the following results: * `mergeSort_sorted`: `mergeSort` produces a sorted list. * `mergeSort_perm`: `mergeSort` is a permutation of the input list. * `mergeSort_of_sorted`: `mergeSort` does not change a sorted list. * `mergeSort_cons`: proves `mergeSort le (x :: xs) = l₁ ++ x :: l₂` for some `l₁, l₂` so that `mergeSort le xs = l₁ ++ l₂`, and no `a ∈ l₁` satisfies `le a x`. * `mergeSort_stable`: if `c` is a sorted sublist of `l`, then `c` is still a sublist of `mergeSort le l`.
15 lines
553 B
Markdown
15 lines
553 B
Markdown
# mergeSortBenchmark
|
|
|
|
Benchmarking `List.mergeSort`.
|
|
|
|
Run `lake exe mergeSort k` to run a benchmark on lists of size `k * 10^5`.
|
|
This reports the average time (in milliseconds) to sort:
|
|
* an already sorted list
|
|
* a reverse sorted list
|
|
* an almost sorted list
|
|
* and a random list with duplicates
|
|
|
|
Run `python3 bench.py` to run this for `k = 1, .., 10`, and calculate a best fit
|
|
of the model `A * k + B * k * log k` to the observed runtimes.
|
|
(This isn't really what one should do:
|
|
fitting a log to data across a single order of magnitude is not helpful.)
|