46 lines
1.2 KiB
Plaintext
46 lines
1.2 KiB
Plaintext
IMPLEMENTATION MergeSort
|
|
|
|
IMPORT Nat COMPLETELY
|
|
IMPORT Seq[nat] COMPLETELY
|
|
|
|
-- Unsortierte Sequenz zu Testzwecken
|
|
FUN testSeq : seq[nat]
|
|
DEF testSeq == %(5,7,6,4,8,3,9,2) ++ %(0,1,10)
|
|
|
|
-- Sortiert die übergebene Sequenz mit Hilfe des Sortier-
|
|
-- verfahrens MergeSort
|
|
FUN mergeSort : seq[nat] -> seq[nat]
|
|
DEF mergeSort == \\ s .
|
|
IF <>?(s) THEN <>
|
|
-- leere Liste sortieren
|
|
OTHERWISE
|
|
IF <>?(rt(s)) THEN ft(s) :: <>
|
|
-- einelementige Liste sortieren
|
|
ELSE LET (s1,s2) == split(s)
|
|
IN merge(mergeSort(s1),mergeSort(s2))
|
|
-- andere Listen sortieren
|
|
FI
|
|
|
|
-- Splittet eine Liste in zwei Listen
|
|
FUN split : seq[nat] -> seq[nat] ** seq[nat]
|
|
DEF split(<>) ==
|
|
(<>, <>)
|
|
DEF split(x::xs) ==
|
|
LET (s1, s2) == split(xs)
|
|
IN (s2, x::s1)
|
|
|
|
-- Fuegt zwei sortierte Listen zusammen
|
|
FUN merge : seq[nat] ** seq[nat] -> seq[nat]
|
|
DEF merge == \\ s1,s2 .
|
|
IF <>?(s1) THEN s2
|
|
IF <>?(s2) THEN s1
|
|
OTHERWISE
|
|
IF ft(s1) > ft(s2) THEN ft(s2) :: merge(s1,rt(s2))
|
|
-- erste Element der zweiten Liste ist kleiner oder gleich
|
|
ELSE ft(s1) :: merge(rt(s1),s2)
|
|
-- erste Element der ersten Liste ist kleiner
|
|
FI
|
|
|
|
-- Testen mit e mergeSort(testSeq)
|
|
-- Ergebnis ist dann <0,1,2,3,4,5,6,7,8,9,10>
|