Announcement

Collapse
No announcement yet.

Shell - Sort kalppt nich

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Shell - Sort kalppt nich

    also hallo erstmal ,

    ich haben eine Listbox mit mehreren einträgen , an die auch ein Objekt rangehänt ist , in diesem Objekt(namens TProblemSpeicher) gibt es einen Integer-Wert(namens Häufigkeit) , ich will die Einträge in der Listbox nach diesen Integer-Werten sortieren (den größten zuerst) ...

    dazu hab ich in einem Delphi5 buch folgende Sortier art gefunden (die heißt Shell sort) :

    ************************************************** ***********
    <pre>
    procedure sort_shell(var a: árray of Word);
    var
    bis,i,j,k : Longint;
    h : word;
    begin
    bis := high(a);
    k := bis shr 1;//div 2
    while k > o do begin
    for i:= 0 ro bis - k do begin
    j := i;
    while (j >= 0) AND (a[j] > a[j + k]) do begin
    h := a[j]; a[j] := a[j+k];a[j+k] = h;
    if j > k then dec(j,k) else J := 0;
    end
    end
    k := k shr 1;//div 2
    end;
    end;
    </pre>
    ************************************************** ***********

    da ich aber die egsamte einträge in der Listbox (String & Objekte) tauschen will habe ich das ganze ein bisschen verändert

    ************************************************** ************
    <pre>
    procedure TForm1.SuchergebnisseSortieren;
    var
    bis: Integer;
    i : Integer;
    j : Integer;
    k : Integer;
    begin
    bis := ListBox1.Items.Count;
    k := bis shr 1;//"shr 1" ist das gleiche wie "div 2"
    while (k > 0) do
    begin
    for i := 0 to (bis - k) do
    begin
    j := i;
    while ((j >= 0) And (TProblemSpeicher(ListBox1.Items.Objects[j]).Haufigkeit > TProblemSpeicher(ListBox1.Items.Objects[j + k]).Haufigkeit)) do//zeile A
    begin
    ListBox1.Items.Exchange(j,j + k);//einträge Tauschen
    if (j > k) then Dec(j,k) else j := 0;
    end;//while ((j> = 0) And with ListBox1 do(Haufigkeitswerteins > Haufigkeitswertzwei)) do
    end;//for i := 0 to (GesamtLange - Intervallgrose) do
    k := k shr 1;//"shr 1" ist das gleiche wie "div 2"
    end;//while (k > 0) do
    end;//procedure TsucheIWformMain.SuchergebnisseSortieren;
    </pre>
    ************************************************** ************

    wenn dich dass ganze denn aber ausführen kommt eine exception "EStrinListError : Listenindex Überschreitet Maximum(7)"

    (ich habe zum Test immer 7 einträge in der Listbox)

    wenn der Fehler auftrit ist Delphi immer in "zeile A"

    (ich arbeite mit Delphi 7)

    thy for help im vorraus

  • #2
    Hallo,

    was passiert, wenn eine gerade Anzahl an Einträgen in der Liste steht? Da die Zählung der Liste bei 0 beginnt, könnte die for i-Schleife, dass Problem sein:

    <pre>
    Anzahl Items = 7
    k (7 div 2) = 3
    bis - k = 4

    wenn jetzt j=i=4, dann ist j+k=7, da aber der höchste Listindex 6 ist, kommt es hier wahrscheinlich zum Laufzeitfehler.
    </pre>

    Gruß
    Thoma

    Comment


    • #3
      Hallo,
      <p>probier mal<br>
      <b>bis := ListBox1.Items.Count-1;</b><br>
      </p>Gruß Andrea

      Comment

      Working...
      X