2016-11-30 20 views
0

Я пытаюсь сортировать массив структур с qsort. Однако у меня возникают проблемы с пониманием того, как сделать функцию сравнения. У меня есть следующая структура:Qsort для сортировки массива структур

typedef struct { 
    char name[TEAM_SIZE]; 
    int points; 
} TEAM; 

И я стараюсь сортировать каждую команду после ее пунктов с наивысшим приоритетом.

qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points); 

И функция сравнения:

int compare_points(const void *a, const void *b) { 
    TEAM *p1 = (TEAM *)a; 
    TEAM *p2 = (TEAM *)b; 

    if(p1->points < p2->points) { 
    return 1; 
    } 
    else { 
    return -1; 
    } 
} 

Как бы вы это сделали?

Выход:

Before:FCN 38 
Before:FCM 59 
Before:OB 46 
Before:AGF 37 
Before:AAB 50 
Before:FCK 71 
Before:HOB 18 
Before:SDR 62 
Before:RFC 47 
Before:BIF 54 
Before:EFB 30 
Before:VFF 40 
After:FCM 59 
After 8 
After:OB 46 
After:AGF 37 
After:AAB 50 
After:FCK 71 
After:HOB 18 
After:SDR 62 
After:RFC 47 
After:BIF 54 
After:EFB 30 
After:VFF 40 
+0

Что не работает? –

+0

@EliSadoff Он просто не сортирует его так, как должно. Добавление вывода, чтобы вы могли видеть. – asdasd

+0

Fyi, если вы хотите более крупную сортировку, вам нужно отменить логику в компараторе. 'qsort' ожидает, что отрицательный результат будет означать« меньше », от нуля до средней эквивалентности, а положительный означает« больше ». И он сортируется по * восходящему * порядку. Итак ... скажите, что большая LHS «меньше», чем RHS, когда она на самом деле больше и наоборот, и она должна сортироваться в том порядке, в котором вы хотите. – WhozCraig

ответ

4

Ваш qsort() вызов является неправильным:

qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points); 

Третий аргумент должен быть размер каждого элемента массива. Вместо этого вы передаете либо размер всего массива, либо размер указателя, в зависимости от того, как объявляется team. Вы хотите:

qsort(team, NUMBER_OF_TEAMS, sizeof(TEAM), compare_points); 

Кроме того, ваша функция сравнения слегка испорчен в том, что она возвращает -1 при p1->points == p2->points. Поскольку вы, похоже, сортируете участника points, ваша функция сравнения должна возвращать 0, когда две команды имеют одинаковое количество очков.

Пример

#include <stdio.h> 
#include <stdlib.h> 

#define TEAM_SIZE 10 

typedef struct { 
    char name[TEAM_SIZE]; 
    int points; 
} TEAM; 


int compare_points(const void *a, const void *b) 
{ 
    const TEAM *p1 = a; 
    const TEAM *p2 = b; 
    return p2->points < p1->points ? -1 : p1->points < p2->points; 
} 

int main() 
{ 
    TEAM teams[] = 
    { 
     { "OB", 46 }, { "AGF", 37 }, 
     { "AAB", 50 }, { "FCK", 71 }, 
     { "HOB", 18 }, { "SDR", 62 }, 
     { "RFC", 47 }, { "BIF", 54 }, 
     { "EFB", 30 }, { "VFF", 40 } 
    }; 

    size_t NUM_TEAMS = sizeof teams/sizeof *teams; 

    qsort(teams, NUM_TEAMS, sizeof(TEAM), compare_points); 

    for (size_t i=0; i< NUM_TEAMS; ++i) 
     printf("%s : %d\n", teams[i].name, teams[i].points); 

    return 0; 
} 

Выход

FCK : 71 
SDR : 62 
BIF : 54 
AAB : 50 
RFC : 47 
OB : 46 
VFF : 40 
AGF : 37 
EFB : 30 
HOB : 18 

See it live here.