Namespaces
Variants

qsort, qsort_s

From cppreference.net
Défini dans l'en-tête <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) (depuis C11)
1) Trie le tableau donné pointé par ptr en ordre croissant. Le tableau contient count éléments de size octets. La fonction pointée par comp est utilisée pour la comparaison des objets.
2) Identique à (1) , sauf que le paramètre de contexte supplémentaire context est passé à comp et que les erreurs suivantes sont détectées à l'exécution et appellent la fonction gestionnaire de contraintes actuellement installée :
  • count ou size est supérieur à RSIZE_MAX
  • ptr ou comp est un pointeur nul (sauf si count est zéro)
Comme pour toutes les fonctions à vérification de limites, qsort_s n'est garanti d'être disponible que si __STDC_LIB_EXT1__ est défini par l'implémentation et si l'utilisateur définit __STDC_WANT_LIB_EXT1__ à la constante entière 1 avant d'inclure <stdlib.h> .

Si comp indique que deux éléments sont équivalents, leur ordre dans le tableau trié résultant n'est pas spécifié.

Table des matières

Paramètres

ptr - pointeur vers le tableau à trier
count - nombre d'éléments dans le tableau
size - taille de chaque élément du tableau en octets
comp - fonction de comparaison qui renvoie une valeur entière négative si le premier argument est inférieur au second, une valeur entière positive si le premier argument est supérieur au second et zéro si les arguments sont équivalents.

La signature de la fonction de comparaison doit être équivalente à ce qui suit :

int cmp ( const void * a, const void * b ) ;

La fonction ne doit pas modifier les objets qui lui sont passés et doit renvoyer des résultats cohérents lorsqu'elle est appelée pour les mêmes objets, indépendamment de leurs positions dans le tableau.

context - informations supplémentaires (par exemple, séquence de classement), passées à comp comme troisième argument

Valeur de retour

1) (aucun)
2) zéro en cas de succès, non nul si une violation des contraintes d'exécution a été détectée

Notes

Malgré son nom, ni les normes C ni POSIX n'exigent que cette fonction soit implémentée en utilisant quicksort ou ne fournissent de garanties concernant la complexité ou la stabilité.

Contrairement aux autres fonctions avec vérification des limites, qsort_s ne considère pas les tableaux de taille nulle comme une violation de contrainte d'exécution et retourne plutôt un succès sans modifier le tableau (l'autre fonction qui accepte les tableaux de taille nulle est bsearch_s ).

L'implémentation de qsort_s dans le CRT Windows n'est pas conforme au standard C. La version de Microsoft est déclarée comme suit : void qsort_s ( void * base, size_t num, size_t width,
int ( * compare ) ( void * , const void * , const void * ) , void * context ) ;
. Elle ne renvoie aucune valeur, et la fonction de comparaison a un ordre des paramètres inversé par rapport au standard : le context est passé en premier.

Exemple

#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");
}

Sortie :

-2147483648 -743 -2 0 2 4 99

Références

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

Voir aussi

recherche un élément de type non spécifié dans un tableau
(fonction)