Fonction de tri en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction qsort pour trier un tableau d’entiers en C
  2. Utilisez la fonction qsort pour trier un tableau de chaînes de caractères en C
Fonction de tri 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);
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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