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.
Hier der dazu passende Code:
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:
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