Schleife | Top 3

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Servus!


    Und zwar bin ich aktuell sehr verwirrt was die Schleife angeht.
    Ich möchte mittendrinne abfragen welche Spieler die 3 besten sind.


    if(Dm15[State]==15)
    {
    new HighestPlayerId = GetPlayerPoolSize();
    for(new j, i = HighestPlayerId; j<i; j++)
    {
    if(IsPlayerConnected(j) && !IsPlayerNPC(j))
    {
    if(Player[j][InMode]==15)
    {
    if(Player[j][RoundKills] != 0)
    {
    if(Dm15[Players] >= 3)
    {

    }
    }
    }
    }
    }
    }


    Das ist mein momentaner Quellcode.


    mfg :thumbup:

  • stock SortArray(array[], source[], methode = 0, a_size = sizeof array, s_size = sizeof source)
    { //By Nero_3D - 10. May 2009
    for(new i; i < a_size; i++) array[i] = -1;
    switch(methode)
    {
    case 0:
    for(new i, y, j; i < s_size; i++)
    for(y = 0; y < a_size; y++)
    if(source[i] > ((array[y] == -1) ? (-1) : (source[array[y]])))
    {
    for(j = a_size - 2; j >= y; j--)
    array[j + 1] = array[j];
    array[y] = i;
    break;
    }
    case 1:
    for(new i, y, j; i < s_size; i++)
    for(y = 0; y < a_size; y++)
    if(source[i] < ((array[y] == -1) ? (0x7F800000) : (source[array[y]])))
    {
    for(j = a_size - 2; j >= y; j--)
    array[j + 1] = array[j];
    array[y] = i;
    break;
    }
    default: return false;
    }
    return true;
    }


    Quelle


    :whistling:

  • Wenn ich den Code wie unten einbaue, dann wird am Anfang
    0 0 0 ausgegeben.
    Wenn ID 1 dann einen Kill macht wird
    1 0 0 ausgegeben, das passt ja soweit,
    aber wenn dann ein anderer Kills macht passiert nichts mehr.

    new variable[3],str[128];
    variable = GetTopThree();
    format(str,sizeof(str),"TopFive Result: %i %i %i",variable[0],variable[1],variable[2]);
    SendClientMessageToAll(COLOR_GREEN,str);


    GetTopThree()
    {
    new TopThree[3], HighestPlayerId = GetPlayerPoolSize();
    for(new i = 0; i < 3; i++)
    {
    for(new a = 0; a < HighestPlayerId; a++)
    {
    for(new b = 0; b < HighestPlayerId; b++)
    {
    if(Player[a][RoundKills] > Player[b][RoundKills])
    {
    if(i == 0 && TopThree[0] < Player[a][RoundKills])
    {
    TopThree[0] = a;
    }
    else if(TopThree[i] < Player[a][RoundKills] && TopThree[i - 1] > Player[a][RoundKills])
    {
    TopThree[i] = a;
    }
    }
    }
    }
    }
    return TopThree;
    }

  • Hier hab ich einen solche Sortierfunktion schon mal gepostet:
    Wie kann ich abfragen, welcher Spieler die höchste Variable hat?


    Ist Bubblesort nicht etwas zu rechenlastig?



    new tmpKills[MAX_PLAYERS], tmpID[MAX_PLAYERS], tmp;


    for(new i=0; i<MAX_PLAYERS; i++)
    {
    tmpKills[i] = Kills[i];
    tmpID[i] = i;
    }


    for (new i = 1 ; i <= MAX_PLAYERS; i++)
    {
    new help = i;

    while ( help > 0 && tmpKills[help] < tmpKills[help - 1])
    {
    tmp = tmpKills[help];
    tmpKills[help] = tmpKills[help-1];
    tmpKills[help-1] = tmp;


    tmp = tmpID[help];
    tmpID[help] = tmpID[help-1];
    tmpID[help-1] = tmp;


    help--;
    }
    }


    Der Algorithmus hat nur ein Bruchteil der Laufzeit.


    Bedanke dich bitte, wenn du den Beitrag als hilfreich empfandest!



  • Der Algorithmus hat nur ein Bruchteil der Laufzeit.


    Also wenn du schon so Aussagen machst, dann belege sie bitte auch. Ich habe es gerade getestet.


    1.) Deine Funktion funktioniert nicht, die sprengt dir in der while-Zeile das tmpKills Array, wenn help = i = MAX_PLAYERS ist.
    2.) Sie hatte nicht mal annähernd nur ein Bruchteil der Laufzeit wenn das Array nicht gesprengt wird, sondern war sogar langsamer, um 4%.
    3.) Ja, es gibt schnellere Varianten, aber das spielt hier kaum eine Rolle und außerdem ist der Bubble-Sort für die meisten am einfachsten zu verstehen.


    Ich würde gerne deine Tests sehen, die deine Aussage bestätigen.

  • 1.) Deine Funktion funktioniert nicht, die sprengt dir in der while-Zeile das tmpKills Array, wenn help = i = MAX_PLAYERS ist.


    Wirst du immer gleich so persönlich, wenn man ein Verbesserungsvorschlag hat?
    Entschuldigung das ich ein "=" zu viel geschrieben habe. Ich kann leider nicht auf meiner Arbeit den Code kompilieren.


    So zur Laufzeit:
    Dein Benchmark ist relativ... Es geht nicht mal hervor wie deine Daten befüllt sind.


    Im besten Fall und schlechtesten Fall haben Insertionsort und Bubblesort gleiche Laufzeiten und Aufrufe.


    Aber im Average Fall hat der Insertionsort die Hälfte der Aufrufe wie Buublesort. [ n(n-1)/2 zu n(n-1)/4]


    Und ich habe bewusst Insertionsort hier genommen, da es sehr ähnlich dem Bubblesort ist und auch nicht als zu schwer ist.


    Bedanke dich bitte, wenn du den Beitrag als hilfreich empfandest!



  • Wirst du immer gleich so persönlich, wenn man ein Verbesserungsvorschlag hat?


    Was war daran persönlich? Ich habe lediglich gesagt, dass deine Methode nicht funktioniert, wenn du das persönlich nimmst tut es mir natürlich Leid, es war nicht persönlich gemeint.



    Dein Benchmark ist relativ... Es geht nicht mal hervor wie deine Daten befüllt sind.
    Im besten Fall und schlechtesten Fall haben Insertionsort und Bubblesort gleiche Laufzeiten und Aufrufe.
    Aber im Average Fall hat der Insertionsort die Hälfte der Aufrufe wie Buublesort. [ n(n-1)/2 zu n(n-1)/4]


    Ist mir schon klar, nur wenn du sagst "nur Bruchteile" dann geht man davon aus, dass das auch der Fall ist und es nicht bei gleichen Daten langsamer ist (irrelevant welche Daten). Ob es wirklich so viel besser ist wäre nur mit einem entsprechenden Benchmark herauszufinden, den du ja nicht gemacht hast.
    Ich würde dazu gerne mal Testdaten sehen, ob das wirklich so viel aus macht wie du sagst, ich bezweifle das nämlich nach meinem Test.