Ordenación en C

qsort

Para la ordenación de un array de elementos en C se dispone de una función estándar denominada, qsort.  La interfaz de la función es:

void
qsort(void *base, size_t nel, size_t size, int (*compar)(const void *, const void *));

Esta función ordenada un array de nel elementos, donde base es un puntero al elemento inicial. El tamaño de cada elemento, en bytes, se especifica con el argumento size. Finalmente, compar es un puntero a una  función que se le pasa como argumento dos punteros a elementos a comparar, y devuelve un entero menor, igual o mayor que cero, segun el primer elemento sea menor, igual o mayor que el segundo.

A continuación se muestra un ejemplo de empleo de qsort para ordenador un array de enteros.
#include <stdio.h>
#include <stdlib.h>

#define MAX_NUMBERS 10000

/* The compare argument is a pointer to the comparison function, which is called with two arguments that point
to the elements being compared. The application shall ensure that the function returns an integer less than, equal to,
or greater than 0, if the first argument is considered respectively less than, equal to, or greater than the second.
If two members compare as equal, their order in the sorted array is unspecified.*/

int compare(const void *_a, const void *_b) {

int *a, *b;

a = (int *) _a;
b = (int *) _b;

return (*a - *b);
}

int main () {

int numbers[MAX_NUMBERS];
int i, size = 0;

while( (scanf("%d",&numbers[size]) != EOF) && (size < MAX_NUMBERS) ){
size ++;
}

for (i = 0; i < size; i ++) {
printf("%d ", numbers[i]);
}
printf ("\n");

qsort(numbers, size, sizeof(int), &compare);

printf ("size:%d\n", size);
for (i = 0; i < size; i ++) {
printf("%d ", numbers[i]);
}

/* Check if numbers is actually sorted */
for (i = 0; i < size-1; i ++) {
if (numbers[i] > numbers[i+1]) {
printf("Failed !!!!!");
break;
}
}

return 0;
}
Universidad Autonoma de Madrid, 2004 - 2005