kak
16.06.2002, 22:39
also ich habe hier folgendes Programm
es soll verkettete Listen mit dem Quicksortalgorithmus sortieren... so ich habe ein laufähiges Program. manchmal stimmt die Sortierung jedoch nicht immer... also kleiner Denkfehler drin..
bitte schaut mal nach was sich da machen läßt...
program quick;
(* -quick ist aufgeteilt in:
1. Initialisierung
2. Input / Output
3. Quicksortalgorithmus mit saemtlichen dazugehoerigen Prozeduren
-zeiger ist globale Variable, die initialisiert wird
-klTIntList, grTIntList, glTIntList sind auch globale, dienen aber nur zur Uebergabe
in den Prozeduren, d.h. sie werden zum zwischenspeichern in der prozedur quickSort benutzt
*)
(* 1. Initialisierung*)
type
TIntList = ^listelement;
listelement = record
daten : integer;
nachf : TIntList;
vorg : TIntList;
end;
var zeiger,test:TIntList;
klTintlist,grTintList,glTintlist:TIntList;
{ 2. Input / Output}
(* -Erstellen der Integerliste
-die Leere Liste wird uebergeben
-die hinzukommenden Elemente werden angehaengt, nil zeiger wird weitergehaengt
dazu wird ein Hilfsliste benoetigt
-die erstellte Liste wird zurueckgegeben
-Es werden ganze Zahlen eingelesen, dabei ist die Eingabe der 0 die Ab-
bruchbedingung
*)
procedure Erstellen(liste:TIntList);
var zahl : integer;
hilf : TIntList;
begin
writeln('Zahlen eingeben (Ende mit "0"): ');
hilf:=liste;
readln(zahl);
while zahl <> 0 do begin
hilf^.daten := zahl;
hilf^.nachf := nil;
readln(zahl);
if zahl = 0 then break;
new(hilf^.nachf);
hilf := hilf^.nachf;
new(hilf^.vorg);
hilf^.vorg:=hilf;
end; {liefert alle Zahlen ausser den 0 in TIntList}
end; {Erstellen}
(* -Ausgabe der Integerliste
-die sortierte Liste wird uebergeben, die einzelnen Elemente werden durchlaufen
und ausgegeben
-dazu wird eine Hilfsliste zum durchlaufen der Liste benoetigt
*)
procedure Ausgabe(liste:TIntList);
var lauf : TIntList;
begin
lauf := liste;
while lauf <> nil do
begin
if lauf^.daten <> 0 then writeln('Ausgabe: ',lauf^.daten);
lauf := lauf^.nachf;
end; {while}
end; {Ausgabe}
{ 3. Quicksortalgorithmus mit den dazugehoerigen Prozeduren}
(* -die Funktion dient der Pivotlieferung
-die Liste wird uebergeben und wird durchlaufen
-zwei Variablen dienen dem abspeichern des ersten und letzten Elementes,
um dann das Pivotelement der Liste zu ermitteln
-Rueckgabe des Pivotwertes
*)
function qsort(s,t:tintlist):tintlist;
var a:integer;u,l,r,h:tintList;
begin
if s = nil then Qsort:=t
else with s^ do begin
a:=daten; u:=nachf;
l:=nil;r:=nil;
while u <> nil do with u^ do
if daten < a then
begin h:=nachf; nachf:=l;l:=u;u:=h end
else
begin h:=nachf;nachf:=r;r:=u;u:=h end;
nachf:= Qsort(r,t);
Qsort:=Qsort(l,s);
end
end;
{---------------Hauptprogramm----------------}
begin
new(zeiger);
zeiger^.Nachf := nil;
zeiger^.Vorg :=nil;
erstellen(zeiger);
qsort(zeiger,test);
ausgabe(zeiger);
ausgabe(test);
readln;
end.
es soll verkettete Listen mit dem Quicksortalgorithmus sortieren... so ich habe ein laufähiges Program. manchmal stimmt die Sortierung jedoch nicht immer... also kleiner Denkfehler drin..
bitte schaut mal nach was sich da machen läßt...
program quick;
(* -quick ist aufgeteilt in:
1. Initialisierung
2. Input / Output
3. Quicksortalgorithmus mit saemtlichen dazugehoerigen Prozeduren
-zeiger ist globale Variable, die initialisiert wird
-klTIntList, grTIntList, glTIntList sind auch globale, dienen aber nur zur Uebergabe
in den Prozeduren, d.h. sie werden zum zwischenspeichern in der prozedur quickSort benutzt
*)
(* 1. Initialisierung*)
type
TIntList = ^listelement;
listelement = record
daten : integer;
nachf : TIntList;
vorg : TIntList;
end;
var zeiger,test:TIntList;
klTintlist,grTintList,glTintlist:TIntList;
{ 2. Input / Output}
(* -Erstellen der Integerliste
-die Leere Liste wird uebergeben
-die hinzukommenden Elemente werden angehaengt, nil zeiger wird weitergehaengt
dazu wird ein Hilfsliste benoetigt
-die erstellte Liste wird zurueckgegeben
-Es werden ganze Zahlen eingelesen, dabei ist die Eingabe der 0 die Ab-
bruchbedingung
*)
procedure Erstellen(liste:TIntList);
var zahl : integer;
hilf : TIntList;
begin
writeln('Zahlen eingeben (Ende mit "0"): ');
hilf:=liste;
readln(zahl);
while zahl <> 0 do begin
hilf^.daten := zahl;
hilf^.nachf := nil;
readln(zahl);
if zahl = 0 then break;
new(hilf^.nachf);
hilf := hilf^.nachf;
new(hilf^.vorg);
hilf^.vorg:=hilf;
end; {liefert alle Zahlen ausser den 0 in TIntList}
end; {Erstellen}
(* -Ausgabe der Integerliste
-die sortierte Liste wird uebergeben, die einzelnen Elemente werden durchlaufen
und ausgegeben
-dazu wird eine Hilfsliste zum durchlaufen der Liste benoetigt
*)
procedure Ausgabe(liste:TIntList);
var lauf : TIntList;
begin
lauf := liste;
while lauf <> nil do
begin
if lauf^.daten <> 0 then writeln('Ausgabe: ',lauf^.daten);
lauf := lauf^.nachf;
end; {while}
end; {Ausgabe}
{ 3. Quicksortalgorithmus mit den dazugehoerigen Prozeduren}
(* -die Funktion dient der Pivotlieferung
-die Liste wird uebergeben und wird durchlaufen
-zwei Variablen dienen dem abspeichern des ersten und letzten Elementes,
um dann das Pivotelement der Liste zu ermitteln
-Rueckgabe des Pivotwertes
*)
function qsort(s,t:tintlist):tintlist;
var a:integer;u,l,r,h:tintList;
begin
if s = nil then Qsort:=t
else with s^ do begin
a:=daten; u:=nachf;
l:=nil;r:=nil;
while u <> nil do with u^ do
if daten < a then
begin h:=nachf; nachf:=l;l:=u;u:=h end
else
begin h:=nachf;nachf:=r;r:=u;u:=h end;
nachf:= Qsort(r,t);
Qsort:=Qsort(l,s);
end
end;
{---------------Hauptprogramm----------------}
begin
new(zeiger);
zeiger^.Nachf := nil;
zeiger^.Vorg :=nil;
erstellen(zeiger);
qsort(zeiger,test);
ausgabe(zeiger);
ausgabe(test);
readln;
end.