Сортировка многомерного массива

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
198
Реакции
16
Помог
1 раз(а)
всем привет.

накатил плагин, который сортирует игроков по значению массива. на практике всё отлично, по сути можно использовать этот способ.
но, я не профессионал, на душе немного тревожно. хотелось бы узнать мнение тех, кто в этом более компетентен.

принцип работы, думаю, понятен. записываем значения в ячейки массива, далее сортируем по кол-ву фрагов и перезаписываем кол-во фрагов и айди в нужную ячейку.
в коде есть погрешности, да же в том же массиве, я выделил 3 ячейки вместо 2.

всё это хорошо, однако в режиме реального времени будет сложно, лично для меня, считывать и выводить (например в худ). в этом вопросе мне как никому другому нужна помощь скриптеров dev-cs. надеюсь на вашу помощь.

p.s генерация айди и фрагов используется для тестов, как и вывод сообщения в консоль. сначала идет вывод сгенерированных чисел, зачем отсортированных.


C++:
#include <amxmodx>

#define MAX_TOP 5

new Kills[MAX_PLAYERS + 1][3];
new str[256];

public plugin_init()
{   
    for(new i = 1; i <= MaxClients; i++)
    {
        Kills[i][1] = random_num(0, 999);
        Kills[i][2] = random_num(1, 32);
        
        server_print("kills %d id %d", Kills[i][1], Kills[i][2]);
    }

    BubbleSort(Kills);
    
    for(new i = 0; i <= MAX_TOP; i++) format(str, sizeof str, "%s ^n- %d, %d", str, Kills[i][2], Kills[i][1])
        
    server_print("======================= %s ^n=======================", str);
    
    
}

BubbleSort(array[][], len = sizeof(array))
{
    for (new i = 0; i < len - 1; i++)
    {
        for (new j = 0; j < len - i - 1; j++)
        {
            if (array[j][1] < array[j + 1][1])
            {
                new KILLs = array[j][1];
                new ID = array[j][2];
                array[j][1] = array[j + 1][1];
                array[j][2] = array[j + 1][2];
                array[j + 1][1] = KILLs;
                array[j + 1][2] = ID;
            }
        }
    }
}
28 Июл 2019
для вывода в реальном времени думаю можно создать отдельный массив, в который записывать отсортированный результат. только что мысль пришла.
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
fantom, благодарю. да уж, лучше бы я сразу сюда обратился.
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
zhorzh78, я знаю об известных методах сортировки, поэтому использовал их. благодарю.
назрел вопрос. в первом посте я предположил как реализовать, но лучше послушаю ваше мнение. в общем, нужно сортировать список игроков в реальном времени, без ущерба массиву (чтобы данные не сбились). чтобы это сделать, нужно создать отдельный массив, в который перемещать отсортированные данные? с пузырьком это понятно как сделать, а с этой функцией пока нет
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
zhorzh78,

C++:
#include <amxmodx>

static g_PlayersList[33][2];

public plugin_init()
{ 
    static sort[33][2];
  
    for(new i = 1; i <= MaxClients; i++)
    {
        g_PlayersList[i][0] = sort[i][0] = i;
        g_PlayersList[i][1] = sort[i][1] = random_num(1, 999);
    }
  
    SortCustom2D(sort, 32, "custom_func_compare");
  
    for(new i = 1; i <= 5; i++)
        server_print("Kills : %d \ ID : %d", sort[i][1], sort[i][0]);
}


public custom_func_compare(x[], y[], array[][], Handle:data)
{
    if(x[1] > y[1])
        return -1;
    else
        if(x[1] < y[1])
            return 1;
  
    return 0;
}
28 Июл 2019
в общем, чуть подробнее объясню. нужно вывести топ игроков в реальном времени. при сортировке одномерного массива, (когда индекс выступает ИДом игрока), счёт сбивается (если у ИД 0 был счёт 1, а у ИД 1 был 999, то после сортировки у ИД 0 будет 999, а у ИД 1 соответственно 1), чтобы этого не произошло, я ищу способ решения. пока что вижу один - создать дополнительный массив, в который будут помещаться данные, а после сортироваться и выводиться
 
Последнее редактирование:
Сообщения
333
Реакции
290
Помог
9 раз(а)
kucklovod, Вы используете двумерный массив для записи индекса игрока. Я бы сделал копию g_PlayersList[33] в нужном месте и сортировку нового массива в https://www.amxmodx.org/api/sorting/SortIntegers (предпочитаю нативные методы)
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
zhorzh78, так-с, пытаюсь сделать так, чтобы [0] соответствовал после сортировки. то есть, чтобы фраги не перескакивали на другого игрока. верное решение?

в цикле будет запись с массива 1 в массив 2, чтобы массив 2 отсортировать и вывести, дабы значения в 1 не сбились (необходимо для работы в реальном времени)
(пока что цикл используется для генерации чисел)

C++:
#include <amxmodx>

static g_PlayerKills[33][2];

public plugin_init()
{  
    static PlayerKillsSort[33][2];
   
    for(new i = 1; i <= MaxClients; i++)
    {
        g_PlayerKills[i][0] = PlayerKillsSort[i][0] = random_num(1, 32);
        g_PlayerKills[i][1] = PlayerKillsSort[i][1] = random_num(1, 30);
    }
   
    SortCustom2D(PlayerKillsSort, 32, "custom_func_compare");
   
    for(new i = 1; i <= 5; i++)
        server_print("Kills : %d \ ID : %d", PlayerKillsSort[i][1], PlayerKillsSort[i][0]);
}


public custom_func_compare(x[], y[], array[][], Handle:data)
{
    if(x[1] > y[1])
        return -1;
    else
        if(x[1] < y[1])
            return 1;
   
    return 0;
}
28 Июл 2019
цель достигнута. благодарю всех за помощь.

плюсы не могу поставить, какие-то, видимо, ограничения
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу