unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; RadioGroup1: TRadioGroup; procedure FormCreate(Sender: TObject); procedure RadioGroup1Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; ints: array[0..999999] of integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var k: integer; begin randomize; for k:=0 to length(ints)-1 do ints[k]:=random(length(ints)*10); end; procedure old_bubbleSort; var i,k,tmp: integer; begin for i:=0 to length(ints)-2 do for k:=0 to length(ints)-2-i do if ints[k] > ints[k+1] then begin tmp:=ints[k]; ints[k]:=ints[k+1]; ints[k+1]:=tmp; end; end; procedure bubbleSort; //mit Abbruchbedingung var i,k,tmp: integer; getauscht: boolean; begin for i:=0 to length(ints)-2 do begin getauscht:=false; for k:=0 to length(ints)-2-i do if ints[k] > ints[k+1] then begin tmp:=ints[k]; ints[k]:=ints[k+1]; ints[k+1]:=tmp; getauscht:=true; end; if not getauscht then break; end; end; procedure minimumSort; //a.k.a. SelectionSort or minSort var i,k,pos,tmp: integer; begin for i:=0 to length(ints)-2 do begin pos:=i; for k:=i+1 to length(ints)-1 do if ints[k] < ints[pos] then pos:=k; if i <> pos then begin tmp:=ints[i]; ints[i]:=ints[pos]; ints[pos]:=tmp; end; end; end; procedure quickSort(Vli,Vre: integer; var liste: array of integer); var li,re,mi,tmpInt: integer; begin li:=Vli; re:=Vre; mi:=liste[(li+re) div 2]; // mi:=liste[random(re-li)+li]; repeat while liste[li] < mi do inc(li); while mi < liste[re] do dec(re); if li <= re then begin tmpInt:=liste[li]; liste[li]:=liste[re]; liste[re]:=tmpInt; inc(li); dec(re); end; until li > re; if Vli < re then quickSort(Vli,re,liste); if Vre > li then quickSort(li,Vre,liste); end; procedure mergeIt(Vli,Vmi,Vre: integer; var liste: array of integer); var tmpArr: array{[0..9999]} of integer; k,IndexLi,IndexRe,IndexTmp: integer; begin setlength(tmpArr,Vre-Vli+1); IndexLi:=Vli; IndexRe:=Vmi+1; IndexTmp:=0; repeat if liste[IndexLi] <= liste[IndexRe] then begin tmpArr[IndexTmp]:=liste[IndexLi]; inc(IndexTmp); inc(IndexLi); end else begin tmpArr[IndexTmp]:=liste[IndexRe]; inc(IndexTmp); inc(indexRe); end; until (IndexLi > Vmi) or (IndexRe > Vre); while IndexLi <= Vmi do begin tmpArr[IndexTmp]:=liste[IndexLi]; inc(IndexTmp); inc(indexLi); end; while IndexRe <= Vre do begin tmpArr[IndexTmp]:=liste[IndexRe]; inc(IndexTmp); inc(IndexRe); end; for k:=Vli to Vre do liste[k]:=tmpArr[k-Vli]; end; procedure mergeSort(Vli,Vre: integer; var liste: array of integer); //mischSortieren var mi: integer; begin if Vli < Vre then begin mi:=(Vli+Vre) DIV 2; mergeSort(Vli,mi,liste); mergeSort(mi+1,Vre,liste); mergeIt(Vli,mi,Vre,liste); end; end; procedure TForm1.RadioGroup1Click(Sender: TObject); var startzeit: Cardinal; k: integer; begin listbox1.Clear; startzeit:= GetTickCount; case Radiogroup1.ItemIndex of 0: old_bubbleSort; 1: bubbleSort; 2: minimumSort; 3: quickSort(0,length(ints)-1,ints); 4: mergeSort(0,length(ints)-1,ints); end; caption:=IntToStr(GetTickCount-startzeit)+'ms wurden benötigt'; if length(ints) <= 10000 then for k:= 0 to length(ints)-1 do listbox1.Items.Add(inttostr(ints[k])); end; procedure TForm1.Button1Click(Sender: TObject); begin FormCreate(self); radiogroup1.ItemIndex:=-1; listbox1.clear; caption:=''; end; end.