Autor Beitrag
Stinger47
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: Do 29.11.07 15:07 
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!)
ausblenden volle Höhe 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:
//Sortierverfahren (Merge) Anfang;
procedure TForm1.SetMyMerge();
var
  i,k,j: Integer;
  MyListbox: TListbox;
  Teiler: Integer;
  Flag: Boolean;
begin

  Flag    :=    TRUE;

  //ÜBERPRÜFEN
  for i:= Form1.ComponentCount -1 downto 0 do
    begin
      //LINKS ANFANG
      // Überprüfe Listboxen
      if (TListbox(findcomponent('Links' + IntToStr(i))).Items.Count > 1then
        begin

          //FLAG FALSE setzen für erneuten durchlauf
          Flag    :=    FALSE;
          ///

          //suche nach leerer Listbox Links
          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);
                  //Teilen
                    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;
                  //Teilen ENDE
                  MyListbox.Free;
                  EXIT;
                end;
          //Suchen ENDE
            end;
      // Überprüfen ENDE
        end;
      //LINKS ENDE


      //RECHTS ANFANG
      if (TListbox(findcomponent('Rechts' + IntToStr(i))).Items.Count > 1then
        begin

          //FLAG FALSE setzen für erneuten durchlauf
          Flag    :=    FALSE;
          ///

          //suche nach leerer Listbox Links
          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);
                  //Teilen
                    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;
                  //Teilen ENDE
                  MyListbox.Free;
                  EXIT;
                end;
          //Suchen ENDE
            end;
      // Überprüfen ENDE
        end;
      //LINKS ENDE
    end;

    if Flag = TRUE then
      EXIT
    else
      Form1.SetMyMerge;


end;
//Sortierverfahren (Merge) Ende;


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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: 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

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Stinger47 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: 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)