Fonction de tri en C
-
Utiliser la fonction
qsort
pour trier un tableau d’entiers en C -
Utilisez la fonction
qsort
pour trier un tableau de chaînes de caractères en C
Cet article explique plusieurs méthodes d’utilisation de la fonction de tri standard de la bibliothèque en C.
Utiliser la fonction qsort
pour trier un tableau d’entiers en C
La fonction qsort
implémente une opération de tri quelque peu générique pour différents tableaux d’éléments de données. Plus précisément, qsort
prend le pointeur de fonction comme quatrième argument pour passer la fonction de comparaison pour un tableau d’éléments donné. Dans ce cas, nous avons implémenté la fonction intCompare
pour comparer un tableau d’entiers en utilisant qsort
. Notez que intCompare
devrait avoir le type - int (*compar)(const void *, const void *)
comme spécifié par le prototype qsort
. Par conséquent, nous allons d’abord placer les arguments p1
/p2
sur les pointeurs int
et ensuite les déréférencer pour accéder aux valeurs elles-mêmes. La valeur de retour de la fonction de comparaison doit être l’entier inférieur à 0 si le premier paramètre est inférieur à l’autre, supérieur à 0 si le premier paramètre est plus grand que le second, et zéro si deux paramètres sont égaux.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int intCompare(const void *p1, const void *p2) {
int int_a = *((int *)p1);
int int_b = *((int *)p2);
if (int_a == int_b)
return 0;
else if (int_a < int_b)
return -1;
else
return 1;
}
void printIntegers(int arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%4d | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
int arr2[] = {53, 32, 12, 52, 87, 43, 93, 23};
printIntegers(arr2, 8);
qsort(arr2, 8, sizeof(int), intCompare);
printIntegers(arr2, 8);
exit(EXIT_SUCCESS);
}
Production :
53 | 32 | 12 | 52 | 87 | 43 | 93 | 23 |
12 | 23 | 32 | 43 | 52 | 53 | 87 | 93 |
Utilisez la fonction qsort
pour trier un tableau de chaînes de caractères en C
qsort
peut trier le tableau de chaînes de caractères en ordre croissant avec strcmp
agissant comme fonction de comparaison. Dans ce cas, nous avons déclaré et initialisé le tableau de pointeurs char
, dont les éléments sont triés avec un seul appel à la fonction qsort
. Notez que le casting et le déréférencement sont la partie nécessaire de la fonction de comparaison car ils prennent les deux paramètres comme types de pointeurs void
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int stringCompare(const void *p1, const void *p2) {
return strcmp(*(char *const *)p1, *(char *const *)p2);
}
void printStrings(char *arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%10s | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
char *arr[] = {"jello", "hello", "mello", "zello", "aello"};
printStrings(arr, 5);
qsort(arr, 5, sizeof(char *), stringCompare);
printStrings(arr, 5);
exit(EXIT_SUCCESS);
}
Production :
jello | hello | mello | zello | aello |
aello | hello | jello | mello | zello |
Alternativement, on peut réimplémenter le code de l’exemple précédent de sorte que l’utilisateur fournisse le tableau de chaînes de caractères avec les arguments du programme et que le tableau trié soit imprimé en tant que sortie. Cette fois, il est essentiel de vérifier s’il y a suffisamment d’arguments passés pour le tri avant de procéder à l’appel de qsort
. Notez que la fonction stringCompare
renvoie directement la valeur de l’appel strcmp
car ce dernier a la même spécification de valeurs de retour que la fonction de comparaison pour le qsort
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int stringCompare(const void *p1, const void *p2) {
return strcmp(*(char *const *)p1, *(char *const *)p2);
}
void printStrings(char *arr[], size_t size) {
for (size_t i = 0; i < size; i++) printf("%10s | ", arr[i]);
printf("\n");
}
int main(int argc, char *argv[]) {
if (argc < 3) {
printf("Usage: ./program string_0 string_1 string_2...\n");
exit(EXIT_FAILURE);
}
printStrings(argv + 1, argc - 1);
qsort(argv + 1, argc - 1, sizeof(char *), stringCompare);
printStrings(argv + 1, argc - 1);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook