2013-07-14 38 views
9

私はこの比較関数を使用してlong long int nosで構成される配列をソートしています。qsortを使用して長いlongの配列をソートして大きなnosで動作しない

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の番号が含まれている場合、それは間違った結果を与えますか?

私は間違いをしていますか?

答えて

15

compareの結果は、intである必要があります。 long longの2つの減算は、intタイプを簡単にオーバーフローさせる可能性があります。

0または1

6

が明示的にこれは、次のコードである-1,1または0を返す、明示的に2つの値を比較し、-1を返してみてください:

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; 
} 
関連する問題