Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Top10 ermitteln
ggehrma - Sa 17.09.05 19:37
Titel: Top10 ermitteln
Hallo,
Ich möchte aus einer Liste mit Zahlen die 10 höchsten Zahlen ermitteln. Bisher mache ich das so:
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: 37:
| var Top10: Array [0..9] OF Integer;
PROCEDURE FindTop10; VAR x,y: Integer; Shuffle: PShuffle; BEGIN FOR x := 0 TO ZahlenListe.Count-1 DO BEGIN Shuffle := PShuffle(ZahlenListe.Objects[x]); IF Shuffle.PlayCount > Top10[0] THEN BEGIN FOR y := 0 TO 8 DO Top10[y+1] := Top10[y]; Top10[0] := Shuffle.PlayCount; END ELSE IF (Shuffle.PlayCount > Top10[1]) AND (Shuffle.PlayCount <= Top10[0]) THEN BEGIN FOR y := 1 TO 8 DO Top10[y+1] := Top10[y]; Top10[1] := Shuffle.PlayCount; END ELSE IF (Shuffle.PlayCount > Top10[2]) AND (Shuffle.PlayCount <= Top10[1]) THEN BEGIN FOR y := 2 TO 8 DO Top10[y+1] := Top10[y]; Top10[2] := Shuffle.PlayCount; END ELSE IF (Shuffle.PlayCount > Top10[3]) AND (Shuffle.PlayCount <= Top10[2]) THEN BEGIN FOR y := 3 TO 8 DO Top10[y+1] := Top10[y]; Top10[3] := Shuffle.PlayCount; END . . . ELSE IF (Shuffle.PlayCount > Top10[9]) AND (Shuffle.PlayCount <= Top10[8]) THEN BEGIN Top10[9] := Shuffle.PlayCount; END; END; END; |
Ich hoffe der Code ist einigermaßen verständlich, da er etwas aus dem Zusammenhang gerissen ist.
Meine Frage ist jetzt, ob man meinen Code noch irgendwie verkürzen kann. Hab da an eine FOR-Schleife gedacht, weiß aber grade nicht, wie ich die da rein bringen soll. Ist wahrscheinlich ganz einfach, aber mir fehlt eben der "aso-Einfall".
mfg, ggehrma.
worm - Sa 17.09.05 19:49
Du hast Recht, mit einer weiteren Schleife wäre der Code um einiges kürzer. Ich will Dir jetzt keinen Code vorkauen, aber im Prinzip holst Du Dir wie bisher einen Wert in Shuffle, und gehst dann in den Top10 von oben (1. Platz) nach unten, bis Du einen Wert findest, der kleiner als Dein Shuffle.PlayCount ist oder bis Du über Platz 10 hinaus bist (-> Abbruch). Dort verschiebst Du dann alle folgenden Werte und fügst Deinen Wert ein. Ganz am Anfang solltest Du deine Top10 natürlich mit Nullen füllen.
ggehrma - So 18.09.05 15:24
Hallo,
ich habe das ganze jetzt mal so versucht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| var Top10: Array [1..10] OF Integer;
PROCEDURE FindTop10; VAR x,y,z: Integer; Shuffle: PShuffle; BEGIN FOR x := 0 TO ZahlenListe.Count-1 DO BEGIN Shuffle := PShuffle(ZahlenListe.Objects[x]); FOR y := 1 TO 10 DO BEGIN IF Top10[y] < Shuffle.PlayCount THEN BEGIN FOR z := 10 DOWNTO y+1 DO Top10[z] := Top10[z-1]; Top10[y] := Shuffle.PlayCount; break; END; END; END; END; |
Aber leider klappt das ganze nicht so wie es soll. Wo liegt mein Fehler?
ggehrma - So 18.09.05 15:32
Ups, funktioniert doch. Hab's nur falsch ausgegeben. Sorry.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!