2011-12-09 15 views
6

si tienen una seriematrices especie de doble en C

double i[5] = {1.023, 1.22, 1.56, 2, 5, 3.331}; 

¿Cómo puedo ordenar los valores para que se vea así:

double i[5] = {1.023, 1.22, 1.56, 2, 3.331, 5}; 

he intentado qsort() sin suerte, después de probar algunos ejemplos, que ocurrió:

qsort(i, 5, sizeof(double), sort); 

int sort(const void *x, const void *y) 
{ 
return (*(double*)x - *(double*)y); 
} 

con => de error: tipo incompatible para el argumento 1 no ordenando la matriz .....

+1

"tipo incompatible para el argumento 1" ¿está seguro de que está compilando esto como C y no como C++? Si realmente tiene que compilarlo como C++, entonces cúbralo a (vacío *). –

+1

Para mayor claridad, su rutina de comparación debe denominarse como 'compare', not' sort'. –

Respuesta

13

El primer argumento para qsort es el puntero al inicio de la matriz que se va a ordenar. En lugar de

qsort(i[5], 5, sizeof(double), sort); 

debe decir

qsort(i, 5, sizeof(double), sort); 

Algunas observaciones adicionales:

  1. La longitud de inicializador i 's es incorrecta (i tiene cinco elementos, sin embargo, el inicializador tiene seis) .
  2. La codificación duradera del 5 en la llamada qsort es más adelante.
  3. El nombre "i" es el más comúnmente utilizado para contadores de bucle y similares.
  4. Llamar a la función de comparación sort es confuso.
  5. Su función de comparación es incorrecta. Considere cómo compararía los números 1.1 y 1.2. También piense qué pasaría si la diferencia entre los dos valores no cabe en un int.

Me gustaría volver a escribir toda su ejemplo, así:

double arr[] = {1.023, 1.22, 1.56, 2, 5, 3.331}; 

int cmp(const void *x, const void *y) 
{ 
    double xx = *(double*)x, yy = *(double*)y; 
    if (xx < yy) return -1; 
    if (xx > yy) return 1; 
    return 0; 
} 

int main() { 
    qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(arr[0]), cmp); 
} 

Tenga en cuenta que la función de comparación anterior todavía no controla correctamente NaNs; Lo dejo como ejercicio para que el lector lo solucione.

+0

opps, typo, actualicé la pregunta, pero ahora, no está devolviendo matriz ordenada :( – tom91136

+0

He intentado con tu ejemplo, pero la matriz ordenada se ve exactamente igual ... – tom91136

+0

@ Tom91136: Tu función 'ordenar' es incorrecta. Vea la respuesta actualizada. – NPE