Hallo Leute!
Ich brauche eure Hilfe beim Sortieralgorithmus Heapsort. Ich muss das Programm für die Schule fertigstellen, aber irgendwie haut der Quelltext leider nicht.
Theoretisch müsste er funktionieren, aber wie das so ist klappt es in der Praxis net.
Vielleicht weil ich probeirt habe mit 2 Listboxen zu sortieren, aber seht selbst:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var Anzahl, vergleich, tausch, hv: Integer;
a: real;
begin
Anzahl:=StrToInt(Edit1.Text);
a:=Anzahl DIV 2; {Berechnung des Anfangsknoten}
vergleich:=0;
tausch:=0;
WHILE ((Listbox1.Items[a-1]<(Listbox1.Items[(2*a)-1]) OR (Listbox1.Items[2*a]))) DO
BEGIN
IF Listbox1.Items[a-1]<Listbox1.Items[2*a-1] {Vergleich mit 1.direkten Nachbarn}
THEN
BEGIN
hv:=Listbox1.Items[a-1];
Listbox1.Items[a-1]:=Listbox1.Items[2*a-1];
Listbox1.Items[2*a-1]:=Listbox1.Items[hv];
vergleich:=vergleich+1;
tausch:=tausch+1;
END
ELSE vergleich:=vergleich+1;
IF Listbox1.Items[a-1]<Listbox1.Items[2*a] {Vergleich mit 2.direkten Nachbarn}
THEN
BEGIN
hv:=Listbox1.Items[a-1];
Listbox1.Items[a-1]:=Listbox1.Items[2*a];
Listbox1.Items[2*a]:=Listbox1.Items[hv];
vergleich:=vergleich+1;
tausch:=tausch+1;
END
ELSE vergleich:=vergleich+1;
a:=a-1; {springt einen Knoten vor}
END;
Label4.Caption:='Es wurde bisher '+IntToStr(vergleich)+' mal verglichen und '+IntToStr(tausch)+' mal getauscht.';
end;
procedure TForm1.Button3Click(Sender: TObject);
var Anzahl, a, zv, vergleich, tausch, hv: Integer;
begin
Anzahl:=StrToInt(Edit1.Text);
Listbox2.Items[0]:=Listbox1.Items[0]; {Wurzel des Heaps wird in Listbox2 ausgegeben}
vergleich:=0;
tausch:=0;
FOR zv:=1 TO (Anzahl-1) DO
BEGIN
Listbox1.Items[0]:=Listbox1.Items[Anzahl-1];
Anzahl:=Anzahl-1;
a:=1;
IF ((Listbox1.Items[a-1]<(Listbox1.Items[2*a-1]) OR (Listbox1.items[2*a]))) THEN
IF Listbox1.Items[a-1]<Listbox1.Items[2*a-1] {Wurzel wird mit direkten Nachbar verglichen}
THEN
BEGIN
hv:=Listbox1.Items[a-1];
Listbox1.Items[a-1]:=Listbox1.Items[2*a-1];
Listbox1.Items[2*a-1]:=Listbox1.Items[hv];
a:=2*a-1;
vergleich:=vergleich+1;
tausch:=tausch+1;
END
ELSE vergleich:=vergleich+1;
IF Listbox1.Items[a-1]<Listbox1.Items[2*a] {Wurzel wird mit direktem Nachbar verglichen}
THEN
BEGIN
hv:=Listbox1.Items[a-1];
Listbox1.Items[a-1]:=Listbox1.Items[2*a];
Listbox1.Items[2*a]:=Listbox1.Items[hv];
a:=2*a;
vergleich:=vergleich+1;
tausch:=tausch+1;
END
ELSE vergleich:=vergleich+1;
WHILE ((Listbox1.Items[a]<(Listbox1.Items[2*a+1]) OR (Listbox1.Items[2*a+2]))) DO {Umformung in einen Heap}
BEGIN
IF Listbox1.Items[a]<Listbox1.Items[2*a+1]
THEN
BEGIN
hv:=Listbox1.Items[a];
Listbox1.Items[a]:=Listbox1.Items[2*a+1];
Listbox1.Items[2*a+1]:=Listbox1.Items[hv];
a:=2*a+1;
vergleich:=vergleich+1;
tausch:=tausch+1;
END
ELSE vergleich:=vergleich+1;
IF Listbox1.Items[a]<Listbox1.Items[2*a+1]
THEN
BEGIN
hv:=Listbox1.Items[a];
Listbox1.Items[a]:=Listbox1.Items[2*a+2];
Listbox1.Items[2*a+2]:=Listbox1.Items[hv];
a:=2*a+2;
vergleich:=vergleich+1;
tausch:=tausch+1;
END
ELSE vergleich:=vergleich+1;
END;
Listbox2.Items[zv]:=Listbox1.Items[0];
END;
Label5.Caption:='Es wurde '+IntToStr(vergleich)+' mal verglichen und '+IntToStr(tausch)+' mal getauscht.';
end;
Vielleicht könnt ihr mir ja helfen und wisst wo der Fehler liegt.
Wär jedenfalls total lieb, wenn mir jemand helfen könnte. Ich sag schon mal Danke im Voraus!
liebe Grüße