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; |
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:
und
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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!