Funzione di ordinamento in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione qsort per ordinare un array di numeri interi in C
  2. Usa la funzione qsort per ordinare un array di stringhe in C
Funzione di ordinamento in C

Questo articolo spiegherà diversi metodi su come utilizzare la funzione di ordinamento della libreria standard in C.

Usa la funzione qsort per ordinare un array di numeri interi in C

La funzione qsort implementa un’operazione di ordinamento piuttosto generica per diversi array di elementi di dati. Vale a dire, qsort fa funzionare il puntatore come quarto argomento per passare la funzione di confronto per un dato array di elementi. In questo caso, abbiamo implementato la funzione intCompare per confrontare array di interi usando qsort. Nota che intCompare dovrebbe avere il tipo - int (*compar)(const void *, const void *) come specificato dal prototipo qsort. Di conseguenza, lanciamo gli argomenti p1 / p2 prima ai puntatori int e poi li dereferenziamo per accedere ai valori stessi. Il valore restituito dalla funzione di confronto deve essere un numero intero minore di 0 se il primo parametro è minore dell’altro, maggiore di 0 se il primo parametro è maggiore del secondo e zero se due parametri sono uguali.

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

Produzione:

53 |   32 |   12 |   52 |   87 |   43 |   93 |   23 |
12 |   23 |   32 |   43 |   52 |   53 |   87 |   93 |

Usa la funzione qsort per ordinare un array di stringhe in C

qsort può ordinare l’array di stringhe in ordine crescente con strcmp che funge da funzione di confronto. In questo caso, abbiamo dichiarato e inizializzato l’array di puntatori char, i cui elementi vengono ordinati con una singola chiamata alla funzione qsort. Si noti che il casting e il dereferencing sono la parte necessaria della funzione di confronto poiché accetta entrambi i parametri come tipi di puntatore 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);
}

Produzione:

jello |      hello |      mello |      zello |      aello |
aello |      hello |      jello |      mello |      zello |

In alternativa, è possibile reimplementare il codice di esempio precedente in modo che l’utente fornisca l’array di stringhe con gli argomenti del programma e l’array ordinato venga stampato come output. Questa volta, è essenziale controllare se ci sono abbastanza argomenti passati per l’ordinamento prima di procedere a chiamare qsort. Si noti che, la funzione stringCompare restituisce direttamente il valore della chiamata strcmp poiché quest’ultima ha la stessa specifica dei valori di ritorno della funzione di confronto per 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);
}
Autore: 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