2013-05-18 4 views
0

변수를 사용하여 구조체 노드를 정렬하려고하는데 결과가 잘못 나온 것입니다.qsort 함수를 사용할 때 무슨 일이 발생 했습니까?

내 결과 :

{5, 4}, {6, 2}, {7, 3}, {4, 1}, {3, 7}, {1, 3}, {0, 0}, 

내 코드 :

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

typedef struct node { 
    int x; 
    int y; 
} n; 

int num = 7; 

int compare(const void *ele1, const void *ele2) { 
    n *px, *py; 
    px = (n *) ele1; 
    py = (n *) ele2; 
    return px->x < py->x; 
} 

int main() { 
    n node[7] = { 
    {4, 1}, 
    {6, 2}, 
    {1, 3}, 
    {5, 4}, 
    {7, 3}, 
    {3, 7} 
    }; 
    int i; 
    qsort(node, num, sizeof (node[0]), compare); 
    for (i = 0; i < num; i++) 
     printf("{%d, %d}, ", node[i].x, node[i].y); 
    return 0; 
} 

요소의 I 종류의 여섯 명 밖에 쌍, 결과 인 경우 :

올바른
{7, 3}, {6, 2}, {5, 4}, {4, 1}, {1, 3}, {0, 0}, 

하지만, 7시에 시도했을 때 위의 결과가 표시됩니다. 왜 그런 일이 일어나는 지 아는 사람이 있습니까? 감사!

답변

7

비교 함수의 결과는 음수, 0 또는 양수를 반환해야합니다. 이 같은 것을 반환해야합니다에만 0 또는 1

귀하의 비교 함수를 반환됩니다

return px->x < py->x ? -1 : px->x == py->x ? 0 : 1; 

또는 terser하지만 조금 더 불투명 :

return px->x - py->x; 

qsort reference를 참조하십시오. 기술적으로 C++ 참조 페이지이지만 설명은 C에도 유용합니다.

부칙

는 미안, 무슨 일이 있었는지 설명하는 것을 잊었다! 비교 함수는 다음을 수행합니다. 때마다 px->x < py->x

  • 이 함수는 실제로 무엇을하지 않을 때, 그것은 px 튜플이 py 튜플보다 생각하고, 1 돌아왔다. (당신은 아마이 경우 음의 값을 반환하고 싶었다.)

  • px->x >= py->x이 함수는 0을 반환 할 때마다, qsort 사실 그들이 또는하지 않았을 수도 있습니다 때 두 값이, 동일한을했다라고 생각하고. 순서가 있었다 당신의 비교 함수가 그것을 말하고 있었는지에 따라

그래서 qsort 그냥 맹목적으로 분할 및 교환되는 요소. 귀하의 기능이 "동등"(0) 또는 "더 큰"(1)만을 제공하고 결코 "적은"것은 아니므로, 최종 결과는 오히려 뒤섞이는 것으로 밝혀졌습니다.

+0

'qsort'는 C 표준 함수이며 비교 함수의 스펙은이 주석에도 적합합니다. "* 배열의 내용은 비교로 가리키는 비교 함수에 의해 오름차순으로 정렬됩니다. 비교되는 개체를 가리키는 두 개의 인수 첫 번째 인수가 각각 이하이거나 두 번째 인수보다 큰 것으로 간주되면이 함수는 0보다 큰 0보다 작거나 같은 정수를 반환합니다. * " –