2016-11-30 1 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'는 부정적인 결과가 "덜"을 의미하고, 0은 등가를 의미하고, 긍정적은 "더 큰"을 의미한다고 예상합니다. 그리고 오름차순 * 순서로 정렬됩니다. 그래서 ... 더 큰 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.