Thema: Delphi merge sort Programm

Einzelnen Beitrag anzeigen

Benutzerbild von hanselmansel
hanselmansel

Registriert seit: 23. Feb 2005
Ort: Kaiserslautern
279 Beiträge
 
Delphi 2009 Enterprise
 
#11

Re: merge sort Programm

  Alt 14. Nov 2005, 16:53
HiHo,

ich habe deine eigenen Kommentare einfach mal entfernt, und durch meinen Senf ersetzt:
Delphi-Quellcode:
type
  TSortierverfahren = class(TForm)
  //Ich würde einen anderen Namen vergeben. Einen, aus dem ersichtlich wird, dass es sich um ein form handelt.
    nsortiert_lb: TListBox;
    sortiert_lb: TListBox;
    Enter_b: TButton;
    Sort_b: TButton;
    New_b: TButton;
    End_b: TButton;
    Eingabefeld_e: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Enter_bClick(Sender: TObject);
    procedure Sort_bClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Mergesort(var List:array of integer);
    procedure New_bClick(Sender: TObject);
    procedure End_bClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Sortierverfahren: TSortierverfahren;
  //Die folgenden 2 Variablen kannst du genausogut im Implementation-Teil deklarieren
  Elements: integer;
  nsortiert: array of integer;

implementation

{$R *.DFM}

procedure TSortierverfahren.Enter_bClick(Sender: TObject);
begin
Sortierverfahren.nsortiert_lb.items.add(eingabefeld_e.text);
Setlength (nsortiert,Elements+1);
nsortiert[Elements] := (StrToInt(eingabefeld_e.text));
Elements:=Elements+1;
Sortierverfahren.eingabefeld_e.text :='';
end;

procedure TSortierverfahren.Sort_bClick(Sender: TObject);
var
  i:integer;
begin
Sortierverfahren.Mergesort(nsortiert);

for i:= 0 to Elements-1 do
  Sortierverfahren.sortiert_lb.items.add(IntToStr(nsortiert[i]));
{Der Begin-End Block ist unnötig. Wenn du wirklich viele Elemente hast, kannst du
die Listbox erst unsichtbar machen, dann die Items einfügen und sie dann wieder sichtbar
machen. Geht schneller. ;-) }

end;

procedure TSortierverfahren.Mergesort(var List:array of integer);
var
  laenge,x,y,z: integer;
  h_array1, h_array2:array of integer;
begin
{MergeSort wird SEHR viel schneller ablaufen, wenn du das Teilen des Feldes erstmal
nur über die Indizies machst. In einer Prozedur "Mische" kannst du die Felder dann flott
zusammenkleben.}

laenge:= length(List);

  Setlength (h_array1, laenge div 2);
  Setlength (h_array2,(laenge + 1) div 2);

  for x:=0 to laenge div 2 - 1 do
    h_array1[x]:=List[x];

  for y:=0 to (laenge + 1) div 2 - 1 do
    h_array2[y]:=List[y+((laenge) div 2)];

  if laenge>2 then
  begin
    mergesort(h_array1);
    mergesort(h_array2);
  end;
  z:=0;
{Wenn du das 2. HilfsFeld spiegelverkehrt einsortierst, dann kannst du einen Zähler
von Rechts loslaufen lassen. wenn sich die zähler treffen isses sortiert. -->
SEHR schöner code}

  while (length(h_array1) <> 0) and (length(h_array2) <>0) do
  begin

    if h_array1[0]<h_array2[0] then
    begin

      List[z]:=h_array1[0];

      for x:=0 to length(h_array1)-2 do
      //unnötiger begin-end-block
      begin
        h_array1[x]:=h_array1[x+1];
      end;

      Setlength (h_array1,length(h_array1)-1);
      end
      else

      begin
        List[z]:=h_array2[0];
        for y:=0 to length(h_array2)-2 do
        begin
          h_array2[y]:=h_array2[y+1];
        end;
        setlength(h_array2,length(h_array2)-1);
      end;
      z:=z+1;
    end;
    if length(h_array1)<>0 then
    begin
      for x:=0 to length(h_array1)-1 do
      begin
        List[z]:=h_array1[x];
        z:=z+1;
      end;
{Nach dem Durchlauf der Schleife ist eins der Hilfsfelder auf jeden Fall leer.
Wenn das andere noch Elemente enthält, dann wird es komplett ins Quell-Array
geschrieben.}
 {O-Ton ich}
    end;
    if length(h_array2)<>0 then
    begin
    for y:=0 to length(h_array2)-1 do
    begin
      List[z]:=h_array2[y];
      z:=z+1;
    end;
  end;
end;
Selbst wenn mein eigener (und von Zeit zu Zeit etwas stranger) Formatierungsstil nicht den offiziellen Regeln entspricht, so ist er dennoch an diese angelehnt. Ich würde dir einmal empfehlen, dir anzuschauen, wie der Rest der Welt den Code formatiert. Für Dritte wird es dadurch sehr viel einfacher deinen Code zu lesen. Hier habe ich das Formatieren "gelernt"

MfG,

hanselmansel
Es gibt nur sehr wenige Probleme auf dieser Welt, die sich nicht mit einigen hundert Gramm Sprengstoff lösen ließen.
  Mit Zitat antworten Zitat