Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array mit "Zeilen" sortieren (https://www.delphipraxis.net/57122-array-mit-zeilen-sortieren.html)

hirnstroem 16. Nov 2005 07:55


Array mit "Zeilen" sortieren
 
'loha Folks,

Mit dem folgenden Shell-Sort-Sortieralgorythmus, wird ein Array n bisschen sortiert:

Delphi-Quellcode:
Procedure ShellSort(var arr: array of Integer);
var
 gr,b,i,c: Integer;
 d : Integer;
begin
 If High(arr)=1 then
 begin
   If arr[0] < arr[1] then
    exit
   else
   begin
     d := arr[0];
     arr[0] := arr[1];
     arr[1] := d
   end
 end;
 gr := High(arr);
 b := gr shr 1;
 while b > 0 do
 begin
   For i := 0 to gr - b do
   begin
     c := i;
     while(c >= 0) and
          (arr[c] > arr[c + b]) do
     begin
       d := arr[c];
       arr[c] := arr[c + b];
       arr[c + b] := d;
       If c > b then
        dec(c, b)
       else
        c := 0
     end
   end;
   b := b shr 1;
 end
end;
Das ganze wird dann irdendwie so aufgerufen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  a: array[0..100] of Integer;
  I: Integer;
begin
  for I:=Low(a) to High(a) do
    a[I]:=Random(High(Integer));
  ShellSort(a);
end;
So weit, so gut. Nun ist es so, dass der Array als "Tabelle" mit der folgenden Struktur missbraucht wird.

----------------------------
| Zahl 0 || .. || Zahl 9 | <- Zeile 1
----------------------------
| Zahl 10 || .. || Zahl 19 | <- Zeile 2
----------------------------

Insgesamt können 320 Integerwerte im Array gespeichert werden, 32 Zeilen à 10 Spalten also.
Nun werden ja mit obigem Algorythmus alle Zahlen sortiert, egal ob sie nun einer bestimmten Zeile angehören oder nicht. Eigentlich jedoch, sollten jeweils die ganzen Zeilen aufgrund der Zahl in der ersten Spalte sortiert werden. Desweiteren müssen die ersten 16, sowie die darauf folgenden 16 Zeilen separat sortiert werden.
Leider überfordert mich das ganze etwas, da die Software an und für sich lauffähig ist, aber halt die Kunst eines anderen ist, dessen Kunst ich irgendwie nicht verstehe.

Tips und Lösungsvorschläge sind also gerne Willkommen :-/

Grüsse
hirnstroem

marabu 16. Nov 2005 08:12

Re: Array mit "Zeilen" sortieren
 
Guten Morgen.

Hilfreich dürfte sein, wenn du deine array Struktur redefinierst:

Delphi-Quellcode:
type
  TFlatArray = array [0..319] of integer;
  TDimArray = array [0..1, 0..15, 0..9] of integer;

Procedure ShellSort(var arr: TDimArray; halfIndex: integer);
begin
  // Hier musst du an den 3-dimensionale Index anpassen.
  // verschoben werden immer 10-er Pakete auf der untersten Indexstufe
  // ...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: TFlatArray;
  i: Integer;
begin
  for i := Low(a) to High(a) do
    a[i] := Random(Length(a));
  ShellSort(TDimArray(a), 0);
  ShellSort(TDimArray(a), 1);
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 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