Почему функция «QSORT» в стандартной библиотеке не работает в моем коде?
Вопрос
#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
struct island{ double left; //gobal
double right;
} island[MAX];
...
int cmp(const void *ptr1,const void *ptr2 )
{
return (*(struct island*)ptr1).right > (*(struct island*)ptr2).right;
}
qsort(island,num,sizeof(island[0]),cmp); // "num" is the number of the input data
//when I do print,it seems that if num<10 is right,else wrong
for(i=0;i<num;i++)
{
printf("%g\t",island[i].right);
}
Решение
Ваш cmp
Функция должна вернуться
1
или больше, если левое значение>
правильное значение0
Если значения равны-1
или меньше, если левое значение<
правильное значение
Ваше сравнение только возвращает 1
(для >
случай) или 0
(все остальные случаи).
Другие советы
Ваш cmp
Функция возвращается 1
Если левый элемент больше правого элемента, в противном случае он возвращается 0
. Анкет Документация для qsort
состояния:
The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respec‐ tively less than, equal to, or greater than the second.
Попробуйте это для функции сравнения:
int cmp(const void *ptr1, const void *ptr2)
{
double first = (*(struct island *)ptr1).right;
double second = (*(struct island *)ptr2).right;
if (first < second) return -1;
else if (first > second) return 1;
else return 0;
}
На странице QSort Man:
Функция сравнения должна возвращать целое число меньше, чем, равно или больше нуля, если первый аргумент считается соответствующим образом меньше, чем, равно или больше, чем второе. Если два члена сравниваются как равные, их порядок в сортированном массиве не определен.
Мне кажется, что ваш CMP этого не делает.
а cmp()
Функция должна вернуть -1, 0 или 1 (или любой отрицательный/0/любой положительный), чтобы представлять упорядочение заданных объектов. Ваша функция возвращает 0 или 1.
Попробуйте с:
int cmp(const void *ptr1,const void *ptr2 )
{
return (*(struct island*)ptr2).right - (*(struct island*)ptr1).right;
}
Не связан с StackOverflow