Espacios de nombres
Variantes
Acciones

qsort, qsort_s

De cppreference.com
< c‎ | algorithm
Definido en la cabecera <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 la matriz dada apuntada por 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.
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 gestor 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)
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 incluir stdlib.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

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

[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); // possible shortcut
    // return arg1 - arg2; // erroneous shortcut (fails if INT_MIN is present)
}
 
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

busca en una matriz de un elemento de tipo no especificado
(función) [editar]