/** * Implements a polymorphic quicksort for arbitrary types with a less function.
*/ class Sort functions
equals[@T]: @T * @T * (@T * @T -> bool) -> bool
equals(a, b, less) == not less(a, b) andnot less(b, a);
[x, y] -> if less(y, x) then [y, x] else [x, y], -- NB, stable for equality
-^[x]^- -> sort[@T]([y | y inseq l & less(y, x)], less) ^
[y | y inseq l & equals[@T](y, x, less) ] ^
sort[@T]([y | y inseq l & less(x, y)], less) end
post bagOf[@T](l) = bagOf[@T](RESULT) and-- Permutation forall i in set {1, ..., len RESULT - 1} & not less(RESULT(i+1), RESULT(i)) -- Sorted!
measurelen l; -- Strictly decreasing
bagOf[@T]: seqof @T -> map @T tonat
bagOf(s) ==
{ i |-> occurs[@T](i, s) | i insetelems s } postdomRESULT = elems s and sizeOfBag[@T](RESULT) = len s;
sizeOfBag[@T]: map @T tonat -> nat
sizeOfBag(b) == if b = {|->} then 0 elselet e insetdom b in b(e) + sizeOfBag[@T]({e} <-: b) measurecarddom b; -- Strictly decreasing
occurs[@T]: @T * seqof @T -> nat
occurs(e, s) == if s = [] then 0 else (if e = hd s then 1 else 0) + occurs[@T](e, tl s) measurelen s; -- Strictly decreasing
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.