Einzelnen Beitrag anzeigen

Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#1

MergeSort Implementation, optimierungsbedraf?

  Alt 5. Mär 2012, 10:47
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.
  Mit Zitat antworten Zitat