Huhu,
Ich habe mir mal die Mühe gemacht und "des lernes halber" einen Mergesort in Delphi umgesetzt.
Ziel war es eigentlich nur ein rekursives Verfahren zu erstellen.
Wenn man die
Unit einbindet kann man mit MergeSort einen Array of Integer Sortieren. Dazu übergibt man einfach den Bereich, den man in dem Array Sortiert haben möchte. Wenn alles sortiert werden soll z.b.: MergeSort(0, High(IntArray), IntArray);
Jetzt würde Ich gerne wissen ob Ihr noch Optimierungsvorschläge habt.
Habe mich sehr ausführlich damit beschäftigt und würde auf diese Art gerne noch etwas dazulernen.
Delphi-Quellcode:
unit SortierAlgorithmen;
interface
type
TIntArray =
array of Integer;
procedure MergeSort(Start : Integer; Ende : Integer; IntArray : TIntArray);
implementation
procedure MergeSort(Start : Integer; Ende : Integer; IntArray : TIntArray);
var
NewEnd : Integer;
NewStart : Integer;
StartGO : Integer;
I : Integer;
ArrayResult : TIntArray;
begin
StartGO := Start;
if (High(IntArray) > 0)
then
begin
NewEnd := Start + ((Ende - Start)
div 2);
NewStart := NewEnd + 1;
if (Start <> NewEnd)
then
begin
MergeSort(Start, NewEnd, IntArray);
end;
if (NewStart <> Ende)
then
begin
MergeSort(NewStart, Ende, IntArray);
end;
I := 0;
SetLength(ArrayResult, 1);
while (Start <= NewEnd)
and (NewStart <= Ende)
do
begin
if (IntArray[Start] > IntArray[NewStart])
then
begin
ArrayResult[I] := IntArray[NewStart];
inc(NewStart);
end
else
begin
ArrayResult[I] := IntArray[Start];
inc(Start);
end;
inc(I);
SetLength(ArrayResult, High(ArrayResult) + 2);
end;
while (Start <= NewEnd)
or (NewStart <= Ende)
do
begin
if (Start <= NewEnd)
then
begin
ArrayResult[I] := IntArray[Start];
inc(Start);
end
else
begin
ArrayResult[I] := IntArray[NewStart];
inc(NewStart);
end;
inc(I);
SetLength(ArrayResult, High(ArrayResult) + 2);
end;
I := 0;
for I := Low(ArrayResult)
to High(ArrayResult) - 1
do
IntArray[StartGO + I] := ArrayResult[I];
end;
end;
end.