Thema: Delphi merge sort Programm

Einzelnen Beitrag anzeigen

Koby

Registriert seit: 7. Nov 2005
10 Beiträge
 
Delphi 5 Professional
 
#10

Re: merge sort Programm

  Alt 14. Nov 2005, 16:06
Hallo Leute ich bin nun fertig mit dem Programm und wollte nun einmal fragen ob ihr verbesserungsvorschläge habt! schreibt einfach drauf los


Delphi-Quellcode:
unit mergesort_fertig;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TSortierverfahren = class(TForm)
    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;
  Elements: integer;
  nsortiert: array of integer;

implementation

{$R *.DFM}

procedure TSortierverfahren.Enter_bClick(Sender: TObject);
begin
// schreibt Zahlen in die nicht sortierte Liste ein
  Sortierverfahren.nsortiert_lb.items.add(eingabefeld_e.text);
// Array wird um 1 vergrößert
  Setlength (nsortiert,Elements+1);
// hier wird es ins Array geschrieben
  nsortiert[Elements] := (StrToInt(eingabefeld_e.text));
// die Zählvariable wird um ein erhöht
  Elements:=Elements+1;
  Sortierverfahren.eingabefeld_e.text :='';
end;

procedure TSortierverfahren.Sort_bClick(Sender: TObject);
var
  i:integer;
begin
//soll Mergesort auf die nich sortierte Liste anwenden
  Sortierverfahren.Mergesort(nsortiert);
// geht alle Zahlen durch und ...
  for i:= 0 to Elements-1 do
  begin
// ... schreibt die Zahlen sortiert in die Liste ein
    Sortierverfahren.sortiert_lb.items.add(IntToStr(nsortiert[i]));
  end;
end;

procedure TSortierverfahren.Mergesort(var List:array of integer);
var
  laenge,x,y,z: integer;
  h_array1, h_array2:array of integer;
begin
//Anzahl der zu sortierenden Elemente bestimmen
  laenge:= length(List);
//Die Hilfsfelder auf halbe Länge teilen
  Setlength (h_array1, laenge div 2);
  Setlength (h_array2,(laenge + 1) div 2);
//Zahlen aus der 1. Hälfte des Quellarray ins 1. Hilfsarray kopieren
  for x:=0 to laenge div 2 - 1 do
    h_array1[x]:=List[x];
//Das gleiche für's 2. Hilfsarray...
  for y:=0 to (laenge + 1) div 2 - 1 do
    h_array2[y]:=List[y+((laenge) div 2)];
//Wenn die Feldlänge > 2, dann rufe die Prozedur rekursiv auf.
  if laenge>2 then
  begin
    mergesort(h_array1);
    mergesort(h_array2);
  end;
  z:=0;
  while (length(h_array1) <> 0) and (length(h_array2) <>0) do
  begin
//Das oberste Element vom kleineren Stapel auswählen...
    if h_array1[0]<h_array2[0] then
    begin
//...und ins Quellarray zurückschreiben
      List[z]:=h_array1[0];
//alle Array-Elemente um 1 nach vorne schieben
      for x:=0 to length(h_array1)-2 do
      begin
        h_array1[x]:=h_array1[x+1];
      end;
//Array verkleinern
      Setlength (h_array1,length(h_array1)-1);
      end
      else
// das selbe noch mal
      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.}

    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;


procedure TSortierverfahren.FormCreate(Sender: TObject);
begin
  Elements:=0;
end;

procedure TSortierverfahren.New_bClick(Sender: TObject);
begin
  Elements:=0;
  Sortierverfahren.sortiert_lb.clear;
  Sortierverfahren.nsortiert_lb.clear;
end;

procedure TSortierverfahren.End_bClick(Sender: TObject);
begin
 close();
end;

end.

Hoffe ihr habt ein paar gute ideen!
Die Dummheit des Menschen ist unendlich, bei dem Weltraum bin ich mir noch nicht sicher!!!

A.E.
  Mit Zitat antworten Zitat