Einzelnen Beitrag anzeigen

TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

ShellSort Problem - Array mit 2 Elementen

  Alt 23. Apr 2009, 08:23
Ich habe aus dem Delphi Buch (Delphi 5 - Grundlagen und Profiwissen, Amazon) die Sortierung Shell-Sort gefunden und die bereits für mehre Projekte verwendet.

Jedoch bin ich jetzt auf ein Problem gestoßen, alle Arrays die sortiert werden fangen bei 0 an, soweit scheint es mit der
Sortierung zu klappen, jedoch habe ich einen Fall das ein Array nur 2 Elemente enthält und jetzt stellt sich raus
das das Array nicht sortiert wird.

Original Quellcode aus dem Buch:
Delphi-Quellcode:
procedure sort_shell(var a: array of Word);
var bis,i,j,k : LongInt;
  h : Word;
begin
  bis := High(a);
  k := bis shr 1; //div 2
  while k > 0 do begin
    for i := 0 to 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;

Mein Array:
Zitat:
Files[0].SortStr := '20090422';
Files[1].SortStr := '20090423';

So meine Implementierung sieht wie folgt aus...
Delphi-Quellcode:
  //Dateien sortieren
  countTo := High(Files);
  k := countTo div 2;

  while (k > 0) do begin
    for i := 0 To countTo - k do begin
      j := i;

      while (j >= 0) and (Files[j].SortStr <= Files[j+k].SortStr) do begin
        //Elemente austauschen
        exchg := Files[j];
        Files[j] := Files[j+k];
        Files[j+k] := exchg;
        if j > k then Dec(j,k) else j := 0;

      end;{while}

    end;{for}
    k := k div 2;
  end;{while}
Das Ergebnis ist das nichts sortiert wird, da bei "k := countTo div 2" k = 0 rauskommt wird die folgende while schleife nicht durchlaufen.

Ich habe mich damit beholfen das bei der initialisierung abgefangen wird ob das Array nur 2 Elemente groß ist oder nicht.

Delphi-Quellcode:
  if Length(Files) = 2 then
    k := 1
  else
    k := countTo div 2;
Dann wird das Array richtig sortiert:
Zitat:
Files[0].SortStr := '20090423';
Files[1].SortStr := '20090422';

Jetzt meine Frage ist das jetzt soweit alles korrekt, ich bin mir nicht sicher ob jetzt alles korrekt sortiert wird oder vielleicht
der letzte Eintrag "vergessen" wird zu sortieren, erste Tests bestätigen dies zwar nicht. Jedoch bin ich etwas verwirrt wieso
Shell-Sort ein Problem hat mit einem "zu kleinen" Array. Haben die Autoren im Buch etwas vergessen oder wo liegt das Problem.
  Mit Zitat antworten Zitat