использование 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);

http://www.cplusplus.com/reference/cstdlib/qsort/