Registriert seit: 18. Sep 2004
Ort: Wentorf
87 Beiträge
Delphi 7 Personal
|
Re: Zerlegesortieren - Probleme (ungültige Zeigeroperation)
8. Jan 2007, 22:03
Moin!
Inzwischen bin ich wieder ein ganzes Stück weiter, stoße jetzt aber auf ein erstaunliches Problem:
Die Zeitmessung, für die Ermittlung der Effektivität unerlässlixh, funktioniert nicht merh. Worann kann das liegen?
neu:
Delphi-Quellcode:
var
a,b1,c,b2:int64;
qq: single;
implementation
uses unit1;
procedure zeitmessung(w,s,o:integer);
begin
if w=0 then begin
QueryPerformanceFrequency(a); //Start
QueryPerformanceCounter(b1);
end;
if w=1 then begin
QueryPerformanceCounter(b2);
qq:=qq+( (b2-b1) /a);
if o=1 then begin
if s=1 then unit1.Form1.lauswahl.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=2 then unit1.Form1.laustausch.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=3 then unit1.Form1.leinfuege.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=4 then unit1.Form1.lzereinf.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=5 then unit1.Form1.lzeraus.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=6 then unit1.Form1.lquick.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
end;
end;
end;
procedure auswahlsort;
var ws,i,q,a:integer;
begin
zeitmessung(0,1,0); //starte zeitmessung
//mausae(0);
//Auswahlsort.
//Hier wird, vom Anfang des arrays aus, das jeweils kleinste Element herausgesucht und der unsor-
//tierten Teilliste hinzugefügt. Dieses wird für jedes Feld bis zum -2. vom Ende aus durchgeführt.
for i:=0 to max-2 do begin
q:=i;
for ws:=i+1 to max-1 do
if nummern[ws]<nummern[q] then
q:=ws;
a:=nummern[i];
nummern[i]:=nummern[q];
nummern[q]:=a;
end;
zeitmessung(1,1,0); //stope zeitmessung
end;
alt:
Delphi-Quellcode:
//unit1:
var
Form1: TForm1;
werte,mPunkt, hilfsliste, nummern,nummernsave: array of Integer;
karten: array of TBitmap;
max,anzahldurch, AnzahlTeillisten,ss,lt, // für zerlegesort (lt=Länge der Teillisten
hi,lu,x :integer; //für squicksort
a,b1,c,b2:int64;
qq: extended;
implementation
{$R *.dfm}
procedure tForm1.wimageload;
var w:integer;
begin
for w:=1 to 33 do begin
karten[w-1]:=TBitmap.Create;
karten[w-1].LoadFromFile(IntToStr(w)+'.bmp');
end;
end;
procedure TForm1.zeitmessung(w,s,o:integer);
begin
if w=0 then begin
QueryPerformanceFrequency(a); //Start
QueryPerformanceCounter(b1);
end;
if w=1 then begin
QueryPerformanceCounter(b2);
qq:=qq+( (b2-b1) /a);
if o=1 then begin
if s=1 then lauswahl.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=2 then laustausch.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=3 then leinfuege.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=4 then lzereinf.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=5 then lzeraus.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
if s=6 then lquick.Caption:=format('Zeit: %g s',[qq/anzahldurch]);
end;
end;
end;
//unit2:
procedure auswahlsort;
var ws,i,q,a:integer;
begin
unit1.Form1.zeitmessung(0,1,0); //starte zeitmessung
//mausae(0);
//Auswahlsort.
//Hier wird, vom Anfang des arrays aus, das jeweils kleinste Element herausgesucht und der unsor-
//tierten Teilliste hinzugefügt. Dieses wird für jedes Feld bis zum -2. vom Ende aus durchgeführt.
for i:=0 to max-2 do begin
q:=i;
for ws:=i+1 to max-1 do
if nummern[ws]<nummern[q] then
q:=ws;
a:=nummern[i];
nummern[i]:=nummern[q];
nummern[q]:=a;
end;
unit1.Form1.zeitmessung(1,1,0); //stope zeitmessung
end;
Wieland S.
|