Perché non funziona “qsort” nel lavoro libreria standard nel mio codice?
Domanda
#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);
}
Soluzione
La funzione cmp
deve restituire
-
1
o superiore se il valore a sinistra è>
il giusto valore -
0
se i valori sono uguali -
-1
o meno se il valore di sinistra è<
il giusto valore
Il confronto restituisce solo 1
(per il caso >
) o 0
(tutti gli altri casi).
Altri suggerimenti
La funzione cmp
sta tornando 1
se l'elemento di sinistra è maggiore l'elemento giusto, altrimenti è 0
ritorno. La documentazione per gli stati 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.
Prova questo per la vostra funzione di confronto:
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;
}
Dalla pagina man qsort:
La funzione di comparazione deve restituire un intero minore, uguale o maggiore di zero se il primo argomento è considerato rispet- vamente inferiore, pari o maggiore del secondo. Se due membri come uguali, il loro ordine nell'array ordinato è indefinito.
Sembra a me come il vostro cmp non lo fa.
la funzione cmp()
dovrebbe restituire -1, 0 o 1 (o qualsiasi negativo / 0 / qualsiasi positivo) per rappresentare ordine degli oggetti dati. la funzione restituisce 0 o 1.
prova con:
int cmp(const void *ptr1,const void *ptr2 )
{
return (*(struct island*)ptr2).right - (*(struct island*)ptr1).right;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow