qsort, qsort_s
|
Défini dans l'en-tête
<stdlib.h>
|
||
| (1) | ||
|
errno_t qsort_s
(
void
*
ptr, rsize_t count, rsize_t size,
int
(
*
comp
)
(
const
void
*
,
const
void
*
,
void
*
)
,
|
(2) | (depuis C11) |
-
- 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_sn'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
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
|
(C11)
|
recherche un élément de type non spécifié dans un tableau
(fonction) |
|
Documentation C++
pour
qsort
|
|