qsort, qsort_s
| Definido en el archivo de encabezado <stdlib.h>
|
||
void qsort( void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *) ); |
(1) | |
errno_t qsort_s( void *ptr, rsize_t count, rsize_t size, int (*comp)(const void *, const void *, void *), void *context ); |
(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:
countosizees mayor que RSIZE_MAXptrocompes un puntero nulo (a menos quecountsea cero)
- Al igual que con todas las funciones verificadas por límites,
qsort_ssó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.
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:
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
|
Valores de retorno
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.
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
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
Véase también
(C11) |
busca en una matriz de un elemento de tipo no especificado (función) |
Documentación de C++ para qsort
| |