Ich programmiere ein Vokabelprogramm.
Um die Datensätze sortieren zu können, versuche ich mich an dem Sortieralgorithmus Quicksort.
Das ist wohl schneller als andere Sortieralgorithmen?
Ich brauche was schnelles, da ich 7344 Vokabeln gespeichert habe.
Eine selbstgeschriebene Procedure dauerte schon bei 50 Vokabeln endlos.
Daher Quicksort:
http://www.delphi-treff.de/tipps/algori ... quicksort/
Das läuft auch.
Das Problem ist, meine Datenstruktur dort einzubinden.
Code: Alles auswählen
procedure Quick_Sort(var Daten[i].Phase: array of Integer; iLo, iHi: Integer);
Fatal: Syntax Error, ")" expected but "[" found.
Im implementation-Bereich konnte ich die Procedure Quicksort daher noch nicht anpassen.
Ich kriege das Programmieren schon irgendwie hin.
Nur bei solchen Deklarationsgeschichten komme ich nicht weiter.
Hier mein Code.
Ganz unten der Originalcode von Quicksort.
Evtl. müsste die Fragestellung heißen:
Gibt es einen Algorithmus, der noch schneller ist als Quicksort.
Code: Alles auswählen
type
TDatensatz = record
Fach : String;
Frage : String;
Antwort: String;
faellig: TDate;
Phase : integer;
end;
TDatenArray = array of TDatensatz;
TForm1 = class(TForm)
procedure Quick_Sort_ButtonClick(Sender: TObject);
// procedure Quick_Sort(var A: array of Integer; iLo, iHi: Integer);
procedure Quick_Sort(var Daten[i].Phase: array of Integer; iLo, iHi: Integer);
private
{ private declarations }
public
{ public declarations }
end;
// Original
//Original
var
Form1 : TForm1;
var
AnzahlVokabeln: integer;
Daten: TDatenArray;
implementation
{$R *.lfm}
Code: Alles auswählen
procedure TForm1.Quick_Sort_ButtonClick(Sender: TObject);
var
iLo, iHi: Integer;
I: Integer;
begin
for i := 0 to AnzahlVokabeln-1 do
begin
StringGrid1.Cells[1,i+1] := IntToStr(Daten[i].Phase);
end;
iLo := 1
iHi := AnzahlVokabeln-1;
Quick_Sort(Daten[i].Phase,iLo, iHi);
end;
Code: Alles auswählen
//procedure TForm1.Quick_Sort(var A: array of Integer; iLo, iHi: Integer);
procedure TForm1.Quick_Sort(var Daten[i].Phase: array of Integer; iLo, iHi: Integer);
var
Lo, Hi, Mid, T: Integer;
begin
Lo := iLo;
Hi := iHi;
Mid := A[(Lo + Hi) div 2];
repeat
while A[Lo] < Mid do Inc(Lo);
while A[Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
T := A[Lo];
A[Lo] := A[Hi];
A[Hi] := T;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then Quick_Sort(A, iLo, Hi);
if Lo < iHi then Quick_Sort(A, Lo, iHi);
for i := 1 to AnzahlVokabeln -1 do
begin
StringGrid1.Cells[2,i] := IntToStr(A[i]);
end;
end;
Hier der Original Quicksort Code:
Code: Alles auswählen
procedure QuickSort(var A: array of Integer);
procedure Quick_Sort(var A: array of Integer; iLo, iHi: Integer);
var
Lo, Hi, Mid, T: Integer;
begin
Lo := iLo;
Hi := iHi;
Mid := A[(Lo + Hi) div 2];
repeat
while A[Lo] < Mid do Inc(Lo);
while A[Hi] > Mid do Dec(Hi);
if Lo <= Hi then
begin
T := A[Lo];
A[Lo] := A[Hi];
A[Hi] := T;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then Quick_Sort(A, iLo, Hi);
if Lo < iHi then Quick_Sort(A, Lo, iHi);
end;
begin
Quick_Sort(A, Low(A), High(A));
end;
Beispiel der Anwendung
procedure TForm1.Button1Click(Sender: TObject);
var
arr: array[0..100] of integer;
I: Integer;
begin
for I:=Low(arr) to High(arr) do
arr[I]:=Random(High(Integer));
QuickSort(arr);
end;
Gruß!
idefix