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..9OF 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[0THEN 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..10OF 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.