2011-11-13 5 views
3

내가 (4,8,7,6,5,9,3,2,1)를 얻을 내가 배열 (9,8,7,6,5,4,3,2,1,1),을 정렬 할 첫 번째 qsort(myArray,100,sizeof(int), comp)C에서 빠른 정렬을 사용하여 역순으로 정렬 (내림차순) 하시겠습니까? 정말 정렬되지 -

int comp(const int * a, const int * b) 
if(a==b) 
{ 
    return 0; 
} 
else 
{ 
    if(a<b) 
    { 
     return -1; 
    } 
    else 
    { 
     return 1; 
    } 
} 

, 이 정말 작동하지 않습니다를 호출 정렬하려면.

둘째, 다른 방향으로 어떻게 정렬합니까? 전달해야 할 qsort에 대한 특별한 플래그가 있습니까?

답변

7

비교 기능이 원하는대로 정렬되도록 변경하십시오.

비교 함수는 비교 된 데이터 (데이터 자체가 아님)에 대한 포인터를 사용합니다. 예 :

int compare (const void* p1, const void* p2) 
{ 
    int i1 = *(int*) p1; 
    int i2 = *(int*) p2; 
    if (i1 < i2) return -1; 
    else if (i1 == i2) return 0; 
    else return 1; 
    /* or simply: return i1 - i2; */ 
} 
+0

무엇을 의미합니까? 실제로 작동하는 비교 기능의 예가 있습니까? 비교 기능을 설정하는 방법을 잘 모르겠습니다. 또한 제 생각에는 광산이 작동한다고 생각했지만, 원래의 하하보다 덜한 배열을 반환합니다 –

+0

내 비교 기능을 테스트 했습니까? 나는 그것이 효과가있을 것이라고 확신한다. qsort의 맨 페이지를 읽으십시오. http://linux.die.net/man/3/qsort –

+0

나는 여전히 같은 주문을 받고있다. 4,8,7,6,5,9,3,2,1,1 –

6

주소가 아닌 값을 비교해야합니다. ,

int comp(const int * a, const int * b) 
{ 
return *a - *b; 
} 

이 순서를 바꾸려면 시도

int comp(const int * a, const int * b) 
{ 
return *b - *a; 
} 
+1

값이 충분히 떨어져있을 때 (예 : INT_MAX와 -1을 비교하는 등) 쉽게 오버플로/언더 플로가 발생하므로 비교의 "바로 가기"로 뺄셈을 사용해서는 안됩니다. – bobbymcr

+0

@bobbymcr, 당신 말이 맞아요. – lhf

+1

* 작동 *하는 간단한 한 줄짜리 비교를 원한다면'return (* a> * b) - (* b> * a); 할 수있다. – caf

2

귀하의 비교가 깨진 사용합니다. 포인터가 가리키는 값 대신 포인터 값을 비교하고 있습니다. 참조 비교 연산자 *ab 비교에 추가하면 제대로 작동합니다.

관련 문제