Ошибка логики сортировки выбора - PullRequest
0 голосов
/ 17 октября 2011

Я использую сортировку выбора для сортировки списка имен из команды по крикету.

Сортировка работает после первого повторения имени 3 раза, что исключает два других имени из массива, который я сортирую.

Входные данные из массива (по порядку):

Кларк Уотсон Пиво Коупленд Хаддин Харрис Хьюз Хасси Джонсон Хавая Лион Марш Паттинсон Понтинг Сайддл Уорнер

Вывод после сортировки массива:

Пиво Пиво Пиво Коупленд Хаддин Харрис Хьюз Хасси Джонсон Хаваджа Лион Марш Паттинсон Понтинг

Код:

void sort_names (Team_t player[]) {
    int pos;
    int min;
    int i, str_check;
    char *temp = NULL;

    for (pos = 0; pos < MAX_PLYR; pos++) {
        min = pos;

        for (i = (pos + 1); i < MAX_PLYR; i++) {
            str_check = strcmp(player[i].pname, player[min].pname);

            if (str_check < 0) {
                min = i;
            }

        }

        if (min != pos) {
            temp = player[pos].pname;
            strcpy(player[pos].pname, player[min].pname);
            strcpy(player[min].pname, temp);
        }
    }    
}

1 Ответ

2 голосов
/ 17 октября 2011

Этот бит вашего кода не поменяет местами записи правильно:

temp = player[pos].pname;
strcpy(player[pos].pname, player[min].pname);
strcpy(player[min].pname, temp);

Первая строка сохраняет указатель на имя игрока 'pos' в temp - , а не само имя. Затем первый strcpy перезаписывает его - он потерян. (Второй strcpy просто копирует ту же строку обратно туда, где она уже была.) Поэтому вы видите, что элемент, который будет сортировать первый, прорастает более одного раза.

...