Perché non funziona “qsort” nel lavoro libreria standard nel mio codice?

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

  •  29-09-2019
  •  | 
  •  

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);
    }
È stato utile?

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
scroll top