Sortierfunktion in C
-
Verwenden der Funktion
qsort
zum Sortieren eines Arrays von ganzen Zahlen in C -
Verwenden Sie die Funktion
qsort
, um ein Array von Zeichenketten in C zu sortieren
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);
}
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