Почему функция «QSORT» в стандартной библиотеке не работает в моем коде?

StackOverflow https://stackoverflow.com/questions/3924549

  •  29-09-2019
  •  | 
  •  

Вопрос

#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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top