Registriert seit: 29. Feb 2004
26 Beiträge
|
Re: Einfache Mergesort Implementierung
2. Apr 2006, 19: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
|
|
Zitat
|