AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

merge sort Programm

Ein Thema von Koby · begonnen am 8. Nov 2005 · letzter Beitrag vom 14. Nov 2005
Antwort Antwort
Seite 2 von 2     12   
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
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz