AGB  ·  Datenschutz  ·  Impressum  







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

Einfache Mergesort Implementierung

Ein Thema von Thunderbolt · begonnen am 2. Apr 2006 · letzter Beitrag vom 4. Apr 2006
 
Benutzerbild von Thunderbolt
Thunderbolt

Registriert seit: 29. Feb 2004
26 Beiträge
 
#3

Re: Einfache Mergesort Implementierung

  Alt 2. Apr 2006, 18:56
Danke. Sehr hilfreiche Antwort...

Ich hab da nen kleinen Text auf die Reihe bekommen, nur schein ich da noch irgendwas nicht richtig gemacht zu haben. Könnte mir jemand das offensichtliche vor die Augen führen?

Delphi-Quellcode:
program Mergesortierdemoprogramm;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const n=30;

var
zufall :array [1..n] of integer;
i :integer;


procedure mergen(Links, MitteLinks, MitteRechts, Rechts :integer; var beispielarray: array of integer);
var
  hilf :array of integer; // Zum mergen der Arrays = Ergebnis
  index_hilf, index_links, index_rechts :integer;
  // Hilfsindex, Laufindezes für die Arrays
begin
  setlength(hilf,(mittelinks-links+1)+(rechts-mitterechts+1));
  //Länge des Arrays berechnen
  index_links:=links; //Startwerte der Laufindezes setzen
  index_rechts:=rechts; //Jeweils auf dem Linken Teil

  //Verschmelz-Vorgang
  for index_hilf:=low(hilf) to high(hilf) do //Durchlaufen des Hilfsarrays
  begin
    //Überprüfung, ob beide "Bereiche" noch Elemente haben
    if ((index_links<=MitteLinks) and (index_rechts<=rechts)) then
      begin
        if (beispielarray[index_links]< beispielarray[index_rechts]) then
          begin
            hilf[index_hilf]:=beispielarray[index_links];
            inc(index_links);
          end
        else
          begin
            hilf[index_hilf]:=beispielarray[index_rechts];
            inc(index_rechts);
          end;
      end
    //Fall "beide haben Elemente" abgearbeitet!
    //nächster Fall: hat der linke noch Elemente?
    else if (index_links <=mittelinks) then
      begin
        hilf[index_hilf]:=beispielarray[index_links];
        inc(index_links);
      end
    //Fall "NUR links hat Elemente abgearbeitet!
    //nächster Fall: hat der rechte evtl. Elemente?
    else if (index_rechts<=rechts) then
      begin
        hilf[index_hilf]:=beispielarray[index_rechts];
        inc(index_rechts);
      end;
    //Der einzige überig bleibende Fall ist, dass beide schon
    //abgearbeitet sind. Kommt nicht in der Schleife zustande!
  end;

    //Letzter Schritt: in die zwei Bereiche zurückkopieren!!!

  index_hilf:=low(hilf);
  for index_links:=links to mittelinks do
  begin
    beispielarray[index_links]:=hilf[index_hilf];
    inc(index_hilf);
  end;
  for index_rechts:=mitterechts to rechts do
  begin
    beispielarray[index_rechts]:=hilf[index_hilf];
    inc(index_hilf);
  end;

end;

procedure sortiere(anfang, ende :integer; var beispielarray: array of integer);
// Übergabe der "Schranken"
var mitte :integer; // Variable zur bestimmung der Arraymitte
begin
  if anfang<ende then //Abbruchbedingung: array mehr als 1 Element
  begin
    mitte:= (anfang+ende) div 2; // Bestimmung der Mitte des Arrays

    sortiere(anfang,mitte,beispielarray); //"Linker" Teil wird sortiert
    sortiere(mitte+1,ende,beispielarray); //"Rechter" Teil wird sortiert
    // Verschmelzen der zwei sortierten Bereiche!
    mergen(Anfang,Mitte,Mitte+1,Ende,beispielarray);
  end;
end;

procedure mergesort(var beispielarray: array of integer);
begin // Aufruf mit Übergabe des
  sortiere(low(beispielarray),high(beispielarray),beispielarray); // zu bearbeitenden Arrays
end; // Aufruf der Unterprozedur
                             // mit Übergabe der "Schranken"
begin
  randomize;
  for i:=1 to n do zufall[i]:=random(n);
  writeln('Ausgangsfeld:');
  for i:=1 to n do write(zufall[i],',');
  writeln; writeln;
  mergesort(zufall);
  writeln('Sortiertes Feld:');
  for i:=1 to n do write(zufall[i],',');
  readln;
end.
Ich habe in der Vergangenheit gute Entscheidungen getroffen. Ich habe in der Zukunft gute Entscheidungen getroffen.
George W. Bush
  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 02:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz