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.