AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Iteratives Mergesort mit Stackemulation

Ein Thema von Delphi-Laie · begonnen am 15. Apr 2011 · letzter Beitrag vom 17. Mär 2016
 
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

Iteratives Mergesort mit Stackemulation

  Alt 15. Apr 2011, 22:05
Beim einfachen Mergesort störte mich dessen von der Rekursion verursachte Stackbeanspruchung, und ich versuchte mithin, diese Rekursion bzw. Stackbeanspruchung zu eliminieren bzw. zu emulieren (oder zu ersetzen), und zwar mit einem schnöden Array. Mit der in R. Sedgewicks Standardwälzer vorgeschlagenen Methode, beispielhaft am Quicksort, kam ich einfach nicht weiter. Vielleicht liegt es daran, daß beim Quicksort bei der Abwärtsbewegung der Rekursion sortiert wird (top-down?), beim Mergesort hingegen erst bei der Aufwärtsbewegung derselben (bottom-up?). Wie es genau bezeichnet wird, ist mir nicht bekannt. Jedenfalls tat ich mich daran, auch für diesen Sortieralgorithmus eine stackbefreite Variante zu generieren, was mir auch nach knapp 2 Tagen endlich gelang. Dabei ist der zweite Aufruf der beiden Rekursivaufrufe

Delphi-Quellcode:
if mitte>links then mergesort(links,mitte);
if rechts>succ(mitte) then mergesort(succ(mitte),rechts);
nicht mehr offensichtlich erkennbar.

Wohlgemerkt: Es geht hier nicht um das von Natur aus iterative sog. Natural Mergesort, bei dem anfängliche vorhandene sortiert vorliegende Teilmengen/-folgen gesucht und gefunden werden und der Algorithmus schrittweise „nach oben“ auf diesen aufbaut. Ebensowenig bedarf die iterative Stackemulation, daß die Anzahl der zu sortierenden Elemente eine Zweierpotenz sein muß (derartige Mergesortvarianten gibt es auch), denn das ist beim gewöhnlichen rekursiven Mergesort ja auch nicht der Fall.

Ich fand dazu im Internet jedenfalls nichts.

Kurzum, hier das nunmehr anscheinend fehlerfreie Resultat:

Delphi-Quellcode:
procedure mergesort(links,rechts:word);
var
stack:array {[0..x]} of byte;{oder word oder integer oder cardinal o.ä,
statisch oder dynamisch zu deklarieren und natürlich auch ausreichend zu dimensionieren...}

mitte,richtung,stackzaehler:word;//Richtung: 0 bedeutet ab-, 1 bedeutet aufwärts
begin
  richtung:=0; //Richtung 0 bedeutet Ab-, Richtung 1 Aufwärtsbewegung
  stackzaehler:=2;
  stack[1]:=0; //nötig wegen der Befehlszeile unten: rechts:=stack[pred(stackzaehler)]
  repeat
  mitte:=(links+rechts) div 2;
  if (richtung=0) and (mitte>links) then //neue Intervallgrenzen ermitteln
    begin
    //mergesort(links,mitte);
    stack[stackzaehler]:=links;
    stack[succ(stackzaehler)]:=rechts;
    inc(stackzaehler,2);
    rechts:=mitte
    end;

  if ((richtung=0) and ((mitte=links)) and (succ(mitte)<=rechts)) //Sortierung 2er einzelner Elemente
  or (richtung=1) //Sortierung durch Mischen sortierter Teilmengen
  then
     begin
     {Hier erfolgt das Verschmelzen („Mergen“) der beiden schon sortierten Teilmengen
      links - mitte und succ(mitte) - rechts
      mit einem Algorithmus beliebiger Wahl (z.B. in meinem Sortierkino}

     end;

    if (links=mitte) or (richtung=1) then
      begin
      if rechts<stack[pred(stackzaehler)] then
        begin //nach „rechts“ hinübergehen
        richtung:=0;
        links:=succ(rechts);
        rechts:=stack[pred(stackzaehler)]
        end
      else
        begin //wieder „auftauchen“
        richtung:=1;
        dec(stackzaehler,2);
        links:=stack[stackzaehler];
        rechts:=stack[succ(stackzaehler)]
        end
      end
  until stackzaehler=0
end;
Edit [17.04.2011, 15:20]: Code geändert

Geändert von Matze (17. Apr 2011 um 20:50 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz