Namespaces
Variants

qsort, qsort_s

From es.cppreference.net
Definido en el 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)
1) Ordena el array dado apuntado por ptr en orden ascendente. El array contiene count elementos de size bytes. La función apuntada por comp se utiliza para la comparación de objetos.
2) Igual que (1) , excepto que el parámetro de contexto adicional context se pasa a comp y que los siguientes errores se detectan en tiempo de ejecución y llaman a la función manejador de restricciones actualmente instalada:
  • count o size es mayor que RSIZE_MAX
  • ptr o comp es un puntero nulo (a menos que count sea cero)
Como con todas las funciones con verificación de límites, qsort_s solo está garantizado que esté disponible si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <stdlib.h> .

Si comp indica dos elementos como equivalentes, su orden en el array ordenado resultante no está especificado.

Contenidos

Parámetros

ptr - puntero al array a ordenar
count - número de elementos en el array
size - tamaño de cada elemento del array en bytes
comp - función de comparación que retorna un valor entero negativo si el primer argumento es menor que el segundo, un valor entero positivo si el primer argumento es mayor que el segundo y cero si los argumentos son equivalentes.

La firma 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 pasados a ella y debe retornar resultados consistentes cuando se llama para los mismos objetos, independientemente de sus posiciones en el array.

​

context - información adicional (ej. secuencia de ordenación), pasada a comp como tercer argumento

Valor de retorno

1) (ninguno)
2) cero en caso de éxito, distinto de cero si se detectó una violación de restricciones en tiempo de ejecución

Notas

A pesar del nombre, ni los estándares de C ni POSIX requieren que esta función se implemente usando quicksort ni ofrecen garantías de complejidad o estabilidad.

A diferencia de otras funciones con verificación de límites, qsort_s no trata los arreglos de tamaño cero como una violación de restricción en tiempo de ejecución y en su lugar retorna exitosamente sin alterar el arreglo (la otra función que acepta arreglos de tamaño cero es bsearch_s ).

La implementación de qsort_s en el Windows CRT es incompatible con el estándar C. La versión de Microsoft se declara como: void qsort_s ( void * base, size_t num, size_t width,
int ( * compare ) ( void * , const void * , const void * ) , void * context ) ;
. No retorna ningún valor, y la función de comparación tiene un orden de parámetros invertido respecto al estándar: el context se pasa primero.

Ejemplo

#include <limits.h>
#include <stdio.h>
#include <stdlib.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); // possible shortcut
    // return arg1 - arg2; // erroneous shortcut: undefined behavior in case of
                           // integer overflow, such as with INT_MIN here
}
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

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.22.5.2 La función qsort (p: TBD)
  • K.3.6.3.2 La función qsort_s (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.22.5.2 La función qsort (p: 258-259)
  • K.3.6.3.2 La función qsort_s (p: 442-443)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.22.5.2 La función qsort (p: 355-356)
  • K.3.6.3.2 La función qsort_s (p: 609)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.20.5.2 La función qsort (p: 319)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.10.5.2 La función qsort

Véase también

busca un elemento de tipo no especificado en un arreglo
(función)