Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Array of Record - Sortier Algo


F34r0fTh3D4rk - Mo 15.08.05 18:03
Titel: Array of Record - Sortier Algo
Hallo, ich habe einen MP3 Player gebastelt und hatte das Problem dass man diesen nicht sortieren konnte, wollte zuerst ein array nehmen mit den Infos (Titel und Interpret) und den Dateinamen, das klappte zuerst nicht, also habe ich zwei listboxen genommen. jetzt bin ich doch auf ein array umgestiegen, weil man die playlist ja sortieren können soll, manuell oder automatisch, nun das "problem":


Delphi-Quelltext
1:
2:
3:
4:
5:
type
  MP3 = record
    Info: string;
    Filename: string;
  end;


Delphi-Quelltext
1:
MP3s: array of MP3;                    


MP3s sollte immer um 1 größer sein als tatsächlich gefüllt, da die Länge anfangs auf 1 steht, dann kommt der inhalt rein und dann wird increased für die nächste mp3.

jetzt möchte ich dieses array alphabetisch bzw ordinal nach dem inhalt von MP3s[x].Info sortieren, da steht jetzt aber schon sowas drinne:

Zitat:

Manowar - Warriors Of The World United

Jetzt muss ich gucken wie ich das mit dem Sortieren mache, ich werde wohl Interpret und Titel trennen und dann wahlweise nach Interpret oder Titel sortieren, was aber, wenn ich dann nach beidem sortieren will ? Muss ich dann das sortierte nochmal Sortieren ?

Naja auf jedenfall brauche ich dafür einen möglichst schnellen Algo, ich habe daran gedacht, jeden buchstaben ordinal umzuwandeln, und dann alle strings zeichen für zeichen zu prüfen, aber ich denke nicht, dass das sonderlich schnell ist und der eigentliche Sortiervorgang ist dann da auch noch nicht drin, wie mache ich das am besten ?

Vieeelen Dank schonmal

MFG

F34r0fTh3D4rk a.k.a. Der Dunkelfürchter


uall@ogc - Mo 15.08.05 18:09

du kannst ganz einfach stringvergleiche nehmen


Delphi-Quelltext
1:
2:
3:
4:
5:
a := 'hallo';
b := 'test';


if b > a then tausche...



wenn nach beidem sortiert werden soll einfach die strings zu einem vorher zusammenfügen

sortieralgo: Quicksort (sollte im forum dazu schon genug beiträge geben, beispiel hat auch broland beigelegt unter Demos\Threads)

und die daten nicht vorher teilen einfach das array an den qucksort übergeben und halt davon nur name, song, bzw beides vergleichen und dann den ganzen record vertauschen


F34r0fTh3D4rk - Mo 15.08.05 18:14

also ist:

Delphi-Quelltext
1:
a < b                    

und

Delphi-Quelltext
1:
abc < bcd < cde                    


oder wie darf ich das verstehen ? dann kann ich meinen kleinen zahlensoriteralgo nähmlich ganz leicht umstellen :?

Klappt, dankeschön :D :wink: :mrgreen:

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:
procedure MP3Sort(var MP3A: array of MP3);
  procedure P_MP3Sort(var MP3A: array of MP3; iLo, iHi: integer);
  var
    Lo, Hi: integer;
    T, Mid: string;
  begin
    Lo := iLo;
    Hi := iHi;
    Mid := MP3A[(Lo + Hi) div 2].Info;
    repeat
      while MP3A[Lo].Info < Mid do
        Inc(Lo);
      while MP3A[Hi].Info > Mid do
        Dec(Hi);
      if Lo <= Hi then
        begin
          T := MP3A[Lo].Info;
          MP3A[Lo].Info := MP3A[Hi].Info;
          MP3A[Hi].Info := T;
          Inc(Lo);
          Dec(Hi);
        end;
    until
      Lo > Hi;
    if Hi > iLo then
      P_MP3Sort(MP3A, iLo, Hi);
    if Lo < iHi then
      P_MP3Sort(MP3A, Lo, iHi);
  end;
begin
  P_MP3Sort(MP3A, Low(MP3A), High(MP3A) - 1);
end;


uall@ogc - Mo 15.08.05 18:17

ja das stimmt, kannst ja testen

a und b sind strings

d.h. es werden sie original ascii werte verglichen

'hallo' < 'test' < 'zuli'


JayEff - Mo 15.08.05 18:19

Ich DENKE du musst erstmal UpperCasen und dann die Buchstaben per ord() in Zahlen verwandeln; oder kann man tatsächlich Strings numerisch mit einander vergleichen? :shock:

edit: WUI das ist praktisch! Wusste ich garnicht!


F34r0fTh3D4rk - Mo 15.08.05 18:25

hab oben die lösung editiert (garnet gemerkt dass schon wieder jemand geantwortet hat :mrgreen: )

also so funzt es (etwas verbessert und einen fehler behoben ;) ):

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:
procedure MP3Sort(var MP3A: array of MP3);
  procedure P_MP3Sort(var MP3A: array of MP3; iLo, iHi: integer);
  var
    Lo, Hi: integer;
    T, F, Mid: string;
  begin
    Lo := iLo;
    Hi := iHi;
    Mid := MP3A[(Lo + Hi) div 2].Info;
    repeat
      while MP3A[Lo].Info < Mid do
        Inc(Lo);
      while MP3A[Hi].Info > Mid do
        Dec(Hi);
      if Lo <= Hi then
        begin
          T := MP3A[Lo].Info;
          F := MP3A[Lo].Filename;
          MP3A[Lo].Info := MP3A[Hi].Info;
          MP3A[Lo].Filename := MP3A[Hi].Filename;
          MP3A[Hi].Info := T;
          MP3A[Hi].Filename := F;
          Inc(Lo);
          Dec(Hi);
        end;
    until
      Lo > Hi;
    if Hi > iLo then
      P_MP3Sort(MP3A, iLo, Hi);
    if Lo < iHi then
      P_MP3Sort(MP3A, Lo, iHi);
  end;
begin
  if High(MP3A) > 1 then
    P_MP3Sort(MP3A, Low(MP3A), High(MP3A) - 1);
end;