Sortierfunktion in C

Jinku Hu 12 Oktober 2023
  1. Verwenden der Funktion qsort zum Sortieren eines Arrays von ganzen Zahlen in C
  2. Verwenden Sie die Funktion qsort, um ein Array von Zeichenketten in C zu sortieren
Sortierfunktion in C

Dieser Artikel erklärt verschiedene Methoden, wie die Sortierfunktion der Standardbibliothek in C verwendet werden kann.

Verwenden der Funktion qsort zum Sortieren eines Arrays von ganzen Zahlen in C

Die Funktion qsort implementiert eine etwas generische Sortieroperation für verschiedene Datenelement-Arrays. Nämlich nimmt qsort den Zeiger auf die Funktion als viertes Argument, um die Vergleichsfunktion für ein gegebenes Array von Elementen zu übergeben. In diesem Fall haben wir die Funktion intCompare implementiert, um Integer-Arrays mit qsort zu vergleichen. Beachten Sie, dass intCompare den Typ - int (*compar)(const void *, const void *) haben sollte, wie vom qsort-Prototyp angegeben. Folglich casten wir die p1/p2-Argumente zunächst in int-Zeiger und dereferenzieren sie dann, um auf die Werte selbst zuzugreifen. Der Rückgabewert der Vergleichsfunktion muss eine Ganzzahl sein, die kleiner als 0 ist, wenn der erste Parameter kleiner als der andere ist, größer als 0, wenn der erste Parameter größer als der zweite ist, und Null, wenn zwei Parameter gleich sind.

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

Ausgabe:

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

Verwenden Sie die Funktion qsort, um ein Array von Zeichenketten in C zu sortieren

qsort kann das String-Array in aufsteigender Reihenfolge sortieren, wobei strcmp als Vergleichsfunktion fungiert. In diesem Fall haben wir das Array aus char-Zeigern deklariert und initialisiert, dessen Elemente mit einem einzigen Aufruf der Funktion qsort sortiert werden. Beachten Sie, dass das Casting und die Dereferenzierung der notwendige Teil der Vergleichsfunktion ist, da sie beide Parameter als void-Zeigertypen annimmt.

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

Ausgabe:

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

Alternativ kann man den vorherigen Beispielcode so reimplementieren, dass der Benutzer das String-Array mit Programmargumenten versorgt und das sortierte Array als Ausgabe ausgegeben wird. Diesmal muss unbedingt geprüft werden, ob genügend Argumente zum Sortieren übergeben wurden, bevor man mit dem Aufruf von qsort fortfährt. Beachten Sie, dass die Funktion stringCompare direkt den Wert des Aufrufs strcmp zurückgibt, da dieser die gleiche Spezifikation der Rückgabewerte hat wie die Vergleichsfunktion für 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);
}
Autor: 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