¿Hay alguna función de biblioteca disponible en la biblioteca estándar de C para ordenar?
¿Hay alguna función de biblioteca disponible en la biblioteca estándar de C para ordenar?
Respuestas:
qsort()
es la función que estás buscando. Lo llama con un puntero a su matriz de datos, el número de elementos en esa matriz, el tamaño de cada elemento y una función de comparación.
Hace su magia y su matriz se ordena en el lugar. A continuación se muestra un ejemplo:
#include <stdio.h>
#include <stdlib.h>
int comp (const void * elem1, const void * elem2)
{
int f = *((int*)elem1);
int s = *((int*)elem2);
if (f > s) return 1;
if (f < s) return -1;
return 0;
}
int main(int argc, char* argv[])
{
int x[] = {4,5,2,3,1,0,9,8,6,7};
qsort (x, sizeof(x)/sizeof(*x), sizeof(*x), comp);
for (int i = 0 ; i < 10 ; i++)
printf ("%d ", x[i]);
return 0;
}
return (f > s) - (f < s);
qsort
función" Punto 4 "Si dos elementos se comparan como iguales, su orden en la matriz ordenada resultante no se especifica."
La biblioteca estándar de C / C ++ <stdlib.h>
contiene qsort
función.
Esta no es la mejor implementación de ordenación rápida del mundo, pero es lo suficientemente rápida y MUY FÁCIL de usar ... la sintaxis formal de qsort es:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
Lo único que necesita implementar es la función compare_function, que toma dos argumentos de tipo "const void", que se pueden convertir a la estructura de datos adecuada y luego devolver uno de estos tres valores:
1. Comparando una lista de números enteros :
simplemente echar a y b números enteros si x < y
, x-y
es negativo, x == y
, x-y = 0
, x > y
, x-y
es positivo
x-y
es una forma de acceso directo para hacerlo :) revertir *x - *y
a *y - *x
para la clasificación en la disminución / orden inverso
int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}
2. Comparación de una lista de cadenas :
Para comparar cadenas, necesita una strcmp
función dentro de <string.h>
lib.
strcmp
por defecto devolverá -ve, 0, ve apropiadamente ... para ordenar en orden inverso, simplemente invierta el signo devuelto por strcmp
#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}
3. Comparación de números de coma flotante :
int compare_function(const void *a,const void *b) {
double *x = (double *) a;
double *y = (double *) b;
// return *x - *y; // this is WRONG...
if (*x < *y) return -1;
else if (*x > *y) return 1; return 0;
}
4. Comparación de registros basados en una clave :
A veces necesita ordenar cosas más complejas, como grabar. Esta es la forma más sencilla de hacerlo utilizando la qsort
biblioteca.
typedef struct {
int key;
double value;
} the_record;
int compare_function(const void *a,const void *b) {
the_record *x = (the_record *) a;
the_record *y = (the_record *) b;
return x->key - y->key;
}
int
, los valores pasados al comparador se int *
disfrazan como void *
. char *
Por lo tanto, al ordenar una matriz de , los valores pasados al comparador se char **
disfrazan como void *
. Por lo tanto, el código correcto debe ser: int compare_function(const void *a,const void *b) { return (strcmp(*(char **)a, *(char **)b)); }
.
if (x > y) return +1; else if (x < y) return -1; else return 0;
, o si desea una expresión simple, entonces return (x > y) - (x < y);
. Esto siempre evalúa dos comparaciones en el nivel C, pero el optimizador podría evitarlo. La resta no funciona con valores sin firmar. La primera versión funciona bien cuando se trata de una serie de comparaciones: primero se comparan 2 miembros enteros de una estructura, y si son iguales, luego dos dobles, luego dos cadenas, etc. Hay más de una forma de hacerlo, en C y Perl.
Seguro: qsort()
es una implementación de cierto tipo (no necesariamente una clasificación rápida como su nombre sugiere).
Pruebe man 3 qsort o lea en http://linux.die.net/man/3/qsort
qsort
no tiene que implementarse con Quicksort.
Si bien no está exactamente en la biblioteca estándar, https://github.com/swenson/sort tiene solo dos archivos de encabezado que puede incluir para obtener acceso a una amplia gama de enrutamientos de clasificación increíblemente rápidos, así:
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP ( x , y ) (( x ) - ( y )) #include "sort.h" / * Ahora tiene acceso a int64_quick_sort, int64_tim_sort, etc., por ejemplo, * / int64_quick_sort ( arreglo , 128 ); / * Asume que tienes int * arr o int arr [128]; * /
Esto debería ser al menos dos veces más rápido que la biblioteca estándar qsort
, ya que no usa punteros de función y tiene muchas otras opciones de algoritmos de clasificación para elegir.
Está en C89, por lo que debería funcionar básicamente en todos los compiladores de C.
prueba qsort
en stdlib.h.
Usar qsort()
en<stdlib.h>
.
@paxdiablo La qsort()
función cumple con ISO / IEC 9899: 1990 (`` ISO C90 '').
Hay varias funciones de clasificación C disponibles en stdlib.h
. Puede hacerlo man 3 qsort
en una máquina Unix para obtener una lista de ellos, pero incluyen: