1
0
This repository has been archived on 2025-03-31. You can view files and clone it, but cannot push or open issues or pull requests.
opal-examples/Blatt03/MergeSort.impl2
2013-10-19 01:17:37 +02:00

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>