Hallo liebe DPler,
ich bin gerade dabei, dass QuickSort Sortierverfahren zu programmieren. Damit ich es besser nachvollziehen kann, würde ich gerne den Algorithmus nach jeder Blocksortierung anhalten, Informationen auslesen und dann weiter laufen lassen.
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 =
class(TForm)
ListBox1: TListBox;
ListBox2: TListBox;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Panel1: TPanel;
Label3: TLabel;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
ListBox3: TListBox;
Label4: TLabel;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
arr:
array[0..100]
of integer;
A:
array of Integer;
geton: Boolean;
iLo, iHi, Lo, Hi, Mid, T: Integer;
implementation
{$R *.dfm}
procedure QuickSort(
var A:
array of Integer; iLo, iHi: Integer);
begin
Lo := iLo;
Hi := iHi;
Mid := A[(Lo + Hi)
div 2];
LabeledEdit1.Text := IntToStr(Hi);
LabeledEdit2.Text := IntToStr(Lo);
LabeledEdit3.Text := IntToStr(Mid);
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;
geton := false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
QuickSort(arr,Low(arr),High(arr));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
Randomize;
for I:=Low(arr)
to High(arr)
do
arr[I]:=Random(100);
for I:=Low(arr)
to High(arr)
do
Listbox1.Items.Add(IntToStr(arr[I]));
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Hi > iLo
then QuickSort(A, iLo, Hi);
if Lo < iHi
then QuickSort(A, Lo, iHi);
end;
procedure TForm1.Button4Click(Sender: TObject);
var
I: Integer;
begin
for I:=Low(arr)
to High(arr)
do
Listbox2.Items.Add(IntToStr(arr[I]));
end;
end.
Zur Erklärung noch ein Screenshot meiner Anwendung im Anhang.
Zunächst wird durch Füllen (Button1) das Array 'arr' mit Zahlen zwischen 0 und 100 befüllt und in der Listbox1 ausgegeben. Um den Sortierungsvorgang zu starten, klickt man auf Start (Button2), wobei die Zahlen schon in größer und kleiner als den Mittelwert sortiert werden (ihr kennt das Verfahren ja).
Jetzt soll die erste Diagnose ausgegeben werden mit Mittelwert, Höchstwert und Lowwert. Wenn ich das mal hinbekommen habe, muss man dann immer auf Weiter (Button 3) klicken, bis zum Ende und dann wird die Liste sortiert über Button4 ausgegeben.
Nun mein eigentliches Problem:
Es kommt nach dem ersten Mal auf 'weiter' klicken, eine Zugriffsverletztung 'EAccessViolation'.
Außerdem findet er bei diesem Block einen Fehler:
LabeledEdit1.Text := IntToStr(Hi);
LabeledEdit2.Text := IntToStr(Lo);
LabeledEdit3.Text := IntToStr(Mid);
Das sei alles ein Undefinierter Bezeichner!
kann mir jemand bei meinem Problem helfen?
PS: Die temporäre Liste erst einmal ignorieren.