/* Sortieralgos als E-Modul, ©95 M. Bennicke */

OPT MODULE

PROC tausch(feld:PTR TO LONG,a,b)
  DEF hilf               -> Hilfsvariable

  hilf:=feld[a]          -> a zwischenspeichern
  feld[a]:=feld[b]       -> b in a kopieren
  feld[b]:=hilf          -> b erhält Wert von a
ENDPROC

EXPORT PROC quick(feld:PTR TO LONG,min,max)
  DEF links,rechts,vgl

  vgl:=feld[(min+max)/2]   -> Vergleichswert
  links:=min               -> aus Mitte nehmen
  rechts:=max
  REPEAT
    -> Feld von links & rechts durchsuchen
    WHILE feld[links]<vgl DO INC links
    WHILE feld[rechts]>vgl DO DEC rechts

    IF links<=rechts -> noch nicht überkreuzt?
      tausch(feld,links,rechts) -> vertauschen
      INC links      -> diese Elemente überspr.
      DEC rechts     -> und Suche fortsetzen
    ENDIF
  UNTIL links>rechts -> olange nicht überkreuzt

  /* bis neue Teilfelder nur noch 1 Element lang
     sind, diese genauso sortieren */
  IF links<max THEN quick(feld,links,max)
  IF rechts>min THEN quick(feld,min,rechts)
ENDPROC

EXPORT PROC bubble(feld:PTR TO LONG,min,max)
  DEF i,j

  FOR i:=max-1 TO 0 STEP -1
    FOR j:=0 TO i  -> jedes Mal 1 Schritt weniger
      -> jedes Element mit Nachfolger vergleichen
      IF feld[j]>feld[j+1] THEN tausch(feld,j,j+1)
    ENDFOR
  ENDFOR
ENDPROC
