2013-07-14 3 views
9

이 비교 함수를 사용하여 long long int nos로 구성된 배열을 정렬합니다.qsort를 사용하여 long n의 배열을 정렬하려면 큰 n을 사용할 수 없습니다.

int compare(const void * p1,const void * p2) 
{ 
    return (* (long long int *)a-*(long long int *)b); 
} 
qsort(array,no of elements,sizeof(long long int),compare) 

이 작은 호를 위해 잘 작동하지만, 경우에 배열이 잘못 결과를 얻을 수 10^10의 한 oreder의 NOS 포함?

내가 만드는 실수는 무엇입니까?

답변

15

compare의 결과는 int이어야합니다. 두 long long의 뺄셈은 int 유형을 쉽게 오버플로 할 수 있습니다 (귀하의 경우 그렇습니다).

명시 두 값을 비교하고, -1, 0 또는 1

6

명시 적으로는 다음과 같은 코드 -1,1- 또는 0을 반환 복귀보십시오

int cmpfunc (const void * a, const void * b) 
{ 
    if(*(long long int*)a - *(long long int*)b < 0) 
     return -1; 
    if(*(long long int*)a - *(long long int*)b > 0) 
     return 1; 
    return 0; 
}