![]() |
Mergesort sortiert nicht...
Hallo,
Ich hoffe ihr könnt mir mit meinem Code weiterhelfen den ich mir mühevoll aufgebaut oder zusammengesucht habe und der leider nicht so läuft... :gruebel: Habe schon in der Suche geschaut aber leider nichts gefunden. Also das ist mein Mergesort. Danke schon mal im voraus! :) (Habe nur den Ausschnitt Kopiert der nicht funktioniert...)
Delphi-Quellcode:
[edit=SirThornberry]Titel geändert denn Hilfe braucht jeder und auch das gewählte Forum sagt dies bereits aus - Mfg, SirThornberry[/edit]
procedure TForm1.btu_SortierenClick(Sender: TObject);
var vZaehlerEinlesen:integer; begin //Einlesen der Listbox in das List-Array For vZaehlerEinlesen:=0 to cZahlen-1 do begin List[vZaehlerEinlesen+1]:=strtoint(Ltb_Eingabe.Items[vZaehlerEinlesen]); end; Mergesort(List[vZaehler1]); for vZaehler1:=0 to cZahlen do begin ltb_Ausgabe.Items.Add(IntToStr(List[vZaehler1])); end end;//procedure TForm1.btu_SortierenClick(Sender: TObject); //****************************************************************************** { Rekursion (=/ iterativ): Bei der rekursiven Programmierung ruft sich eine Prozedur, Funktion oder Methode in einem Computerprogramm selbst wieder auf. } procedure TForm1.Mergesort(var List:array of integer); var vlaenge,vZahlx,vZahly,vZahlz :integer; h_array1, h_array2 :array of integer; begin //Festlegen der längen der Beiden SortierArrays vlaenge:= length(List); Setlength (h_array1, vlaenge div 2); Setlength (h_array2,(vlaenge + 1) div 2); //Aufteilen des ListArrays auf die Einzelarrays for vZahlx:=0 to vlaenge div 2 - 1 do begin h_array1[vZahlx]:=List[vZahlx]; end; for vZahly:=0 to (vlaenge + 1) div 2 - 1 do begin h_array2[vZahly]:=List[vZahly+((vlaenge) div 2)]; end; // Sortieren der Array mit "mergesort" if vlaenge > 2 then begin mergesort(h_array1); mergesort(h_array2); end; vZahlz:=0; // while (length(h_array1) <> 0) and (length(h_array2) <>0) do begin If h_array1[0] < h_array2[0] then Begin List[vZahlz] := h_array1[0]; for vZahlx:=0 to length(h_array1)-2 do h_array1[vZahlx]:=h_array1[vZahlx+1]; Setlength (h_array1,length(h_array1)-1); end Else begin List[vZaehler1]:=h_array2[0]; for vZahly:=0 to length(h_array2)-2 do h_array2[vZahly]:=h_array2[vZahly+1]; setlength(h_array2,length(h_array2)-1); end; vZaehler1:=vZaehler1+1; end; if length(h_array1)<>0 then for vZahlx:=0 to length(h_array1)-1 do begin List[vZaehler1]:=h_array1[vZahlx]; vZaehler1:=vZaehler1+1; end; if length(h_array2)<>0 then for vZahly:=0 to length(h_array2)-1 do begin List[vZahlz]:=h_array2[vZahly]; vZaehler1:=vZaehler1+1; end; end;//procedure TForm1.btu_ZufallClick(Sender: TObject); |
Re: Mergesort sortiert nicht... HILFE!!!
Zitat:
|
Re: Mergesort sortiert nicht... HILFE!!!
sorry...
also das Problem ist, dass der das Array "List" (also was aus der Listbox kommt) wieder genau so ausgibt wie es eingelesen wurde außer das jetzt eine 0 am Anfang steht. |
Re: Mergesort sortiert nicht... HILFE!!!
Zitat:
Wie soll das bitte funktionieren? In der Funktion wird plötzlich mit der globalen Variable "vZaehler1" gearbeitet. Globale Variablen sind böse, in einer Funktion die rekursiv aufgerufen wird tötlich, die haben dort nichts zu suchen. Ersetz dort überall durch "vZahlz". Am besten die Sortierfunktion in eine eigene Unit verlagern. Es gibt keinen Grund warum das Sortieren von Zahlen eine Methode der Klasse TForm1 sein sollte. |
Re: Mergesort sortiert nicht...
Ja den Fehler habe ich schon erfolgreich behoben... nur leider sortiert er scheinbar immer noch nicht die eingegebenen Zahlen nach der Größe...
Ich bin über alle Vorschläge dankbar... Wäre auch über ein Funktionierendes Programm dankbar wenn es sowas gibt. Hier mein jetziges Programm:
Delphi-Quellcode:
procedure TForm1.btu_SortierenClick(Sender: TObject);
var vZaehlerEinlesen:integer; begin //Einlesen der Listbox in das List-Array For vZaehlerEinlesen:=0 to cZahlen-1 do begin List[vZaehlerEinlesen+1]:=strtoint(Ltb_Eingabe.Items[vZaehlerEinlesen]); end; Mergesort(List); for vZaehler1:=0 to cZahlen do begin ltb_Ausgabe.Items.Add(IntToStr(List[vZaehler1])); end; end;//procedure TForm1.btu_SortierenClick(Sender: TObject); //****************************************************************************** procedure TForm1.Mergesort (var List:array of integer); var vZahlx,vZahly,vZahlz,vZaehlerEinlesen,vlaenge :integer; h_array1, h_array2 :array of integer; begin vlaenge:= length(List); //Festlegen der längen der Beiden SortierArrays Setlength (h_array1, vlaenge div 2); Setlength (h_array2,(vlaenge + 1) div 2); //Aufteilen des ListArrays auf die Einzelarrays for vZahlx:=0 to vlaenge div 2 - 1 do begin h_array1[vZahlx]:=List[vZahlx]; end; for vZahly:=0 to (vlaenge + 1) div 2 - 1 do begin h_array2[vZahly]:=List[vZahly+((vlaenge) div 2)]; end; // Sortieren der Array mit "mergesort" //if vlaenge > 2 then if vlaenge > 2 then begin mergesort(h_array1); mergesort(h_array2); end; vZahlz:=0; // while (length(h_array1) <> 0) and (length(h_array2) <>0) do begin If h_array1[0] < h_array2[0] then Begin List[vZahlz] := h_array1[0]; for vZahlx:=0 to length(h_array1)-2 do h_array1[vZahlx]:=h_array1[vZahlx+1]; Setlength (h_array1,length(h_array1)-1); end Else begin List[vZaehler1]:=h_array2[0]; for vZahly:=0 to length(h_array2)-2 do h_array2[vZahly]:=h_array2[vZahly+1]; setlength(h_array2,length(h_array2)-1); end; vZaehler1:=vZaehler1+1; end; if length(h_array1)<>0 then for vZahlx:=0 to length(h_array1)-1 do begin List[vZaehler1]:=h_array1[vZahlx]; vZaehler1:=vZaehler1+1; end; if length(h_array2)<>0 then for vZahly:=0 to length(h_array2)-1 do begin List[vZahlz]:=h_array2[vZahly]; vZaehler1:=vZaehler1+1; end; end;//procedure TForm1.btu_ZufallClick(Sender: TObject); |
Re: Mergesort sortiert nicht...
hallo DAZZLE
wo ist Dein Problem? Wenn Du durchführst was Blub Dir geschrieben hat, dann funktioniert auch alles! Zitat:
Delphi-Quellcode:
Gruß
procedure Mergesort (var List:array of integer);
var vZahlx, vZahly, vZahlz vZaehlerEinlesen, vlaenge : integer; h_array1, h_array2 : array of integer; begin vlaenge:= length(List); //Festlegen der längen der Beiden SortierArrays Setlength (h_array1, vlaenge div 2); Setlength (h_array2,(vlaenge + 1) div 2); //Aufteilen des ListArrays auf die Einzelarrays for vZahlx:=0 to vlaenge div 2 - 1 do begin h_array1[vZahlx]:=List[vZahlx]; end; for vZahly:=0 to (vlaenge + 1) div 2 - 1 do begin h_array2[vZahly]:=List[vZahly+((vlaenge) div 2)]; end; // Sortieren der Array mit "mergesort" //if vlaenge > 2 then if vlaenge > 2 then begin mergesort(h_array1); mergesort(h_array2); end; vZahlz:=0; // while (length(h_array1) <> 0) and (length(h_array2) <>0) do begin If h_array1[0] < h_array2[0] then Begin List[vZahlz] := h_array1[0]; for vZahlx:=0 to length(h_array1)-2 do h_array1[vZahlx]:=h_array1[vZahlx+1]; Setlength (h_array1,length(h_array1)-1); end Else begin List[vZahlz]:=h_array2[0]; for vZahly:=0 to length(h_array2)-2 do h_array2[vZahly]:=h_array2[vZahly+1]; setlength(h_array2,length(h_array2)-1); end; vZahlz:=vZahlz+1; end; if length(h_array1)<>0 then for vZahlx:=0 to length(h_array1)-1 do begin List[vZahlz]:=h_array1[vZahlx]; vZahlz:=vZahlz+1; end; if length(h_array2)<>0 then for vZahly:=0 to length(h_array2)-1 do begin List[vZahlz]:=h_array2[vZahly]; vZahlz:=vZahlz+1; end; end;//procedure TForm1.btu_ZufallClick(Sender: TObject); procedure TForm1.Button1Click(Sender: TObject); var i : integer; LIST : array [0..13] of integer; begin //Einlesen der Listbox in das List-Array list[0]:= 2456; list[1]:= 56; list[2]:= 1456; list[3]:= 6; list[4]:= 5456; list[5]:= 3456; list[6]:= 4456; list[7]:= 5456; list[8]:= 6456; list[9]:= 89456; list[10]:= 7456; list[11]:= 8456; list[12]:=88456; list[13]:= 89; Mergesort(List); for i:=0 to length(list) do memo1.lines.add(inttostr(list[i])); end;//procedure TForm1.btu_SortierenClick(Sender: TObject); //****************************************************************************** end. K-H Edit Tippfehler |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz