использование qsort для сортировки массива long long int не работает для больших nos
Я использую эту функцию сравнения для сортировки массива, состоящего из длинных длинных int 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)
это отлично работает для небольших nos, но когда массив содержит nos oreder 10^10, он дает неправильные результаты?
какую ошибку я делаю?
3 ответов
результат compare
функция должна быть int
. Вычитание двух long long
может легко переполнить int
type (и это происходит в вашем случае).
попробуйте явно сравнить два значения и вернуть -1, 0 или 1.
явно возвращает -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;
}
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
qsort (values, 6, sizeof(int), compare);