Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Merge-Sort-Fehler beim Teilen
Stinger47 - Do 29.11.07 15:07
Titel: Merge-Sort-Fehler beim Teilen
Hallo,
nachdem ich mich in das merge-sort verfahren noch etwas eingelesen habe, möchte ich nun einen kleinen ausschnitt hier veröffentlichen.
und zwar habe ich eine listbox, in die items eingeragen werden, die dann mittels merge-sort sortiert werden sollen.
zunächst werden so viele listboxen erstellt, wie items vorhanden sind (Links1,links2;rechts1,rechts2 etc.).
aus der ausgangslistbox werden die items ersteinmal in links1 und rechts 1 aufgeteilt und nun wird die merge procedure gestartet...(es handelt sich hierbei NUR um das aufteilen der items!)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97:
| procedure TForm1.SetMyMerge(); var i,k,j: Integer; MyListbox: TListbox; Teiler: Integer; Flag: Boolean; begin
Flag := TRUE;
for i:= Form1.ComponentCount -1 downto 0 do begin if (TListbox(findcomponent('Links' + IntToStr(i))).Items.Count > 1) then begin
Flag := FALSE; for k:= Form1.ComponentCount -1 downto 0 do begin
if TListbox(findcomponent('Links' + IntToStr(k))).Items.Count = 0 then begin MyListbox := TListbox.Create(self); MyListbox := TListbox(findcomponent('Links' + IntToStr(k))); Teiler := Trunc(MyListbox.Items.Count); for j:= 0 to Teiler do begin
TListbox(findcomponent('Links' + IntToSTr(k))).Items.Add( TListbox(findcomponent('Links' + IntToStr(i))).Items[j]); TListbox(findcomponent('Links' + IntToStr(i))).Items.Delete(j); end; MyListbox.Free; EXIT; end; end; end;
if (TListbox(findcomponent('Rechts' + IntToStr(i))).Items.Count > 1) then begin
Flag := FALSE; for k:= Form1.ComponentCount -1 downto 0 do begin
if TListbox(findcomponent('Rechts' + IntToStr(k))).Items.Count = 0 then begin MyListbox := TListbox.Create(self); MyListbox := TListbox(findcomponent('Rechts' + IntToStr(k))); Teiler := Trunc(MyListbox.Items.Count); for j:= 0 to Teiler do begin
TListbox(findcomponent('Rechts' + IntToSTr(k))).Items.Add( TListbox(findcomponent('Rechts' + IntToStr(i))).Items[j]); TListbox(findcomponent('Rechts' + IntToStr(i))).Items.Delete(j); end; MyListbox.Free; EXIT; end; end; end; end;
if Flag = TRUE then EXIT else Form1.SetMyMerge;
end; |
allerdings bricht er bereits in zeile 17 ab, was etwas negativ ist...;)
falls ich komplett falsch an die sache gegangen bin, bin ich für hinweise offen
dankeschön schonmal für antworten...:)
freak4fun - Do 29.11.07 15:51
Hab ich das richtig verstanden? Du erstellst für JEDES Item EINE Listbox, hast also in JEDER neuen List nur EIN Item? Dann kann das nicht true werden: (TListbox(findcomponent('Links' + IntToStr(i))).Items.Count > 1)
MfG
freak
Stinger47 - Do 29.11.07 17:32
nun das ding ist doch das die listen bei merge sort doch solange aufgeteilt werden bis in jeder liste nur noch ein item steht....
es wär wohl schlauer über ein array oder dergleichen zu gehen, allerdings war ich mir da nicht so sicher und wollte es ersteinmal so versuchen, um es besser zu verstehen und es ersteinmal zum laufen zu bringen und später verbessern.
also ich habe eine listbox, wo ich zahlen eintrage, die sortiert werden sollen. auf den sortierbutton erstellt er so viele listboxen wie items da sind.
nun teilt er die listbox, wo ich am anfang die zahlen eingegeben habe in zwei listboxen auf (eine hälfte in Links1, den rest in Rechts1 --> beides Listboxen).
nun fängt er an eine listbox zu suchen, in der einträge zu finden sind und zwar mehr als einer --> >1; ist das der fall so stellt er die variable auf false, was ein erneutes aufrufen der procedure bewirken soll. ist eine solche listbox gefunden sucht er nun eine leere listbox in die aufgeteilt werden kann.
ist keine listbox gefunden, in der mehr als ein item vorahnden ist, bleibt Flag = TRUE und das rekursive aufrufen wird abgebrochen. ist dies der fall wird nun das mischen gestartet (kommt noch...;) soll erstmal bitte nur um das teilen gehen)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!