Почему функция "qsort" в стандартной библиотеке не работает в моем коде? - PullRequest
0 голосов
/ 13 октября 2010
#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);
    }

Ответы [ 4 ]

2 голосов
/ 13 октября 2010

Ваша функция cmp должна возвращать

  • 1 или больше, если левое значение > правильное значение
  • 0 если значения равны
  • -1 или меньше, если левое значение < правильное значение

Ваше сравнение возвращает только 1 (для случая >) или 0 (для всех остальных случаев).

1 голос
/ 13 октября 2010

Ваша функция 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;
}
0 голосов
/ 13 октября 2010

со страницы руководства qsort:

Функция сравнения должна возвращать целое число меньше, равно или больше нуля, если первый аргумент считается соответствующим значительно меньше, равно или больше второго. Если два члена сравните как равные, их порядок в отсортированном массиве не определен.

Мне кажется, что ваш cmp этого не делает.

0 голосов
/ 13 октября 2010

функция cmp() должна возвращать -1, 0 или 1 (или любое отрицательное / 0 / любое положительное), чтобы представить порядок заданных объектов.ваша функция возвращает 0 или 1.

попробуйте:

int cmp(const void *ptr1,const void *ptr2 )           
{
    return (*(struct island*)ptr2).right - (*(struct island*)ptr1).right;
}
...