Autor Beitrag
Dragonclaw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: Sa 06.01.07 17:28 
Hallo,
ich bin gerade dabei ein Programm zum visuellem Sortieren zu schreiben, damit möchte ich erklären wie die einzelnen Sortierverfahren arbeiten: MinSort, QuickSort, BubbleSort. Leider ist mir kein besserer Threadname eingefallen.

Die Zahlen werden hierbei als Liniendargestellt, welche dann am Ende sortiert aus gegeben werden. Ein bisschen schwer das zu erklären, deshalb hier ein Bild: Vor und nach dem Sortieren.

user defined image

Hier der dazu passende Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
  for i := 1 to 500 do zahlen[i] := Succ(random(500));
  Zahlen_malen;
end;

procedure TForm1.Zahlen_malen;
var i : integer;
begin
with Image1.Canvas do begin
  Brush.Color:=RGB(255,255,255);
  FillRect(rect(0,0,Image1.Width,Image1.Height));
end;
for i := 1 to 500 do
  begin
  with Image1.Canvas do 
    begin
      pen.Color := clnavy;
      moveto(i,500);
      lineto(i,500-zahlen[i]);
    end;
  end;
end;


Nun will ich , das wenn ein Tauschvorgang in dem Sortieralgo vorgenommen wird, die prozedur Zahlen_malen aufgerufen wird.
Da sieht der Code für Quicksort dann so aus:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
procedure TForm1.QuickSort;

  procedure QSort(LoIndex, HiIndex: Integer);
  var
    Lo, Hi: Integer;
    Pivot: Integer;
    Swap: Integer;
  begin
    Pivot := zahlen[(LoIndex + HiIndex) div 2];
    Lo := LoIndex;
    Hi := HiIndex;
    repeat
      while zahlen[Lo] < Pivot do Inc(Lo);
      while zahlen[Hi] > Pivot do Dec(Hi);
      if Lo <= Hi then
      begin
        Swap := zahlen[Lo];
        zahlen[Lo] := zahlen[Hi];
        zahlen[Hi] := Swap;
        Zahlen_malen;
        sleep(100);
        Inc(Lo);
        Dec(Hi);
      end;
    until Lo > Hi;
    if LoIndex < Hi then QSort(LoIndex, Hi);
    if Lo < HiIndex then QSort(Lo, HiIndex);
  end;
begin
  QSort(Low(zahlen), High(zahlen));

end;


Erst dachte ich es liegt daran, dass das ganze zu schnell geht und hab da nen sleep reingebaut, jetzt dauert er zwar länger, daber den eigentlich sortiert prozess sehe ich immer noch nicht. Wo hab ich einen Fehler gemacht?

Vielen Dank schon mal

Dragonclaw
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 06.01.07 17:31 
Gehts mit Application.ProcessMessages auch nicht?

Jedenfalls gibts bei Delphi ja die Demo mit Multithreading und drei Algorithmen, die fast genau wie dein Bild aussieht, sieh dir das doch mal an ;-).
Dragonclaw Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: Sa 06.01.07 18:25 
Vielen Dank,einfach ein Application.ProcessMessages eingefügt und schon klappts:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
if Lo <= Hi then
      begin
        Swap := zahlen[Lo];
        zahlen[Lo] := zahlen[Hi];
        zahlen[Hi] := Swap;
        Application.ProcessMessages;  //<<<--Hier
        Zahlen_malen;                     
        sleep(33);                    //<<<--Damit man was sieht
        Inc(Lo);
        Dec(Hi);
      end;