qsort, qsort_s
Definido en el archivo de encabezado <stdlib.h>
|
||
(1) | ||
errno_t qsort_s( void *ptr, rsize_t count, rsize_t size, int (*comp)(const void *, const void *, void *), |
(2) | (desde C11) |
ptr
en orden ascendente. La matriz contiene elementos count
de size
tamaño. La función apuntada por comp
se utiliza para la comparación de objetos. context
se pasa a comp
y que los siguientes errores se detectan en tiempo de ejecución y llaman a la función gestor de restricciones actualmente instalada:
-
count
osize
es mayor que RSIZE_MAX -
ptr
ocomp
es un puntero nulo (a menos quecount
sea cero)
-
- Al igual que con todas las funciones verificadas por límites,
qsort_s
sólo se garantiza que está disponible si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ a la constante entera 1 antes de incluirstdlib.h
.
Si comp
indica dos elementos como equivalentes, su orden en la matriz ordenada resultante no es especificado.
Contenido |
[editar] Parámetros
ptr | - | puntero a la matriz a ordenar |
count | - | número de elementos de la matriz |
size | - | tamaño de cada elemento de la matriz en bytes |
comp | - | función de comparación que devuelve un valor entero negativo si el primer argumento es menor que el segundo, devuelve un valor entero positivo si el primer argumento es mayor que el segundo y cero si los argumentos son iguales. La identificación de la función de comparación debe ser equivalente a la siguiente: int cmp(const void *a, const void *b); La función no debe modificar los objetos que se le pasan y debe devolver resultados consistentes cuando se le piden los mismos objetos, independientemente de su posición en la matriz. |
context | - | información adicional (por ejemplo, secuencia de compaginación), pasada a comp como tercer argumento
|
[editar] Valores de retorno
[editar] Observaciones
A pesar del nombre, ni los estándares C ni POSIX requieren que esta función se implemente utilizando quicksort o que ofrezca garantías de complejidad o estabilidad.
A diferencia de otras funciones verificadas en los límites, qsort_s
no trata las matrices de tamaño cero como una violación de restricción de tiempo de ejecución y en su lugar devuelve con éxito sin alterar la matriz (la otra función que acepta matrices de tamaño cero es bsearch_s).
Hasta que se creó qsort_s
, los usuarios de qsort
utilizaban a menudo variables globales para pasar contexto adicional a la función de comparación.
[editar] Ejemplo
#include <stdio.h> #include <stdlib.h> #include <limits.h> int compare_ints(const void* a, const void* b) { int arg1 = *(const int*)a; int arg2 = *(const int*)b; if (arg1 < arg2) return -1; if (arg1 > arg2) return 1; return 0; // return (arg1 > arg2) - (arg1 < arg2); // posible acceso directo // return arg1 - arg2; // acceso directo erróneo (falla si INT_MIN está presente) } int main(void) { int ints[] = { -2, 99, 0, -743, 2, INT_MIN, 4 }; int size = sizeof ints / sizeof *ints; qsort(ints, size, sizeof(int), compare_ints); for (int i = 0; i < size; i++) { printf("%d ", ints[i]); } printf("\n"); }
Salida:
-2147483648 -743 -2 0 2 4 99
[editar] Referencias
- Standard C11 (ISO/IEC 9899:2011):
- 7.22.5.2 The qsort function (p: 355-356)
- K.3.6.3.2 The qsort_s function (p: 609)
- Standard C99 (ISO/IEC 9899:1999):
- 7.20.5.2 The qsort function (p: 319)
- Standard C89/C90 (ISO/IEC 9899:1990):
- 4.10.5.2 The qsort function
[editar] Véase también
bsearchbsearch_s (C11) |
busca en una matriz de un elemento de tipo no especificado (función) |
Documentación de C++ para qsort
|