qsort verwenden
Die Sortierfunktion der Standardbibliothek
qsort verwenden ist eine kostenlose C Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Die Sortierfunktion der Standardbibliothek
Die C-Standardbibliothek stellt qsort in <stdlib.h> bereit. Damit lässt sich jedes Array mithilfe einer Vergleichsfunktion sortieren, sodass Sie nur selten eine eigene Sortierfunktion schreiben müssen.
Die Signatur von qsort
Der Prototyp lautet:
baseZeiger auf das erste ElementnmembAnzahl der ElementesizeBytes pro ElementcomparZeiger auf eine Vergleichsfunktion
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
Eine Vergleichsfunktion schreiben
Die Vergleichsfunktion erhält zwei const void *. Wandeln Sie sie in den tatsächlichen Typ um, dereferenzieren Sie sie und geben Sie einen negativen Wert, null oder einen positiven Wert zurück.
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void *a, const void *b) {
int x = *(const int *)a;
int y = *(const int *)b;
return (x > y) - (x < y); /* safe, no overflow */
}
int main(void) {
int a[] = {5, 2, 9, 1, 3};
qsort(a, 5, sizeof(int), cmp_int);
for (int i = 0; i < 5; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}Vermeiden Sie Subtraktionen in Vergleichsfunktionen
Die Rückgabe von x - y kann bei großen Ganzzahlen einen Überlauf verursachen und dadurch falsche Ergebnisse liefern. Verwenden Sie stattdessen das Idiom mit der Differenz boolescher Werte: (x > y) - (x < y).
#include <stdio.h>
int main(void) {
int x = 2000000000, y = -2000000000;
printf("unsafe x-y = %d\n", x - y); /* overflow */
printf("safe = %d\n", (x > y) - (x < y));
return 0;
}Absteigende Reihenfolge
Um absteigend zu sortieren, kehren Sie einfach das Ergebnis des Vergleichs um.
#include <stdio.h>
#include <stdlib.h>
int cmp_desc(const void *a, const void *b) {
int x = *(const int *)a, y = *(const int *)b;
return (y > x) - (y < x);
}
int main(void) {
int a[] = {5, 2, 9, 1, 3};
qsort(a, 5, sizeof(int), cmp_desc);
for (int i = 0; i < 5; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}Zeichenketten sortieren
Um ein Array aus char * zu sortieren, erhält die Vergleichsfunktion Zeiger auf die Zeiger. Wandeln Sie sie in const char * const * um und rufen Sie strcmp auf.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp_str(const void *a, const void *b) {
const char *x = *(const char * const *)a;
const char *y = *(const char * const *)b;
return strcmp(x, y);
}
int main(void) {
const char *names[] = {"charlie", "alice", "bob"};
qsort(names, 3, sizeof(char *), cmp_str);
for (int i = 0; i < 3; i++) printf("%s ", names[i]);
printf("\n");
return 0;
}Strukturen sortieren
Sie können ein Array aus Strukturen nach jedem beliebigen Feld sortieren. Hier ordnen wir Personen nach ihrem Alter.
#include <stdio.h>
#include <stdlib.h>
typedef struct { char name[16]; int age; } Person;
int by_age(const void *a, const void *b) {
const Person *p = a, *q = b;
return (p->age > q->age) - (p->age < q->age);
}
int main(void) {
Person ppl[] = {{"Ann", 30}, {"Ben", 25}, {"Cid", 40}};
qsort(ppl, 3, sizeof(Person), by_age);
for (int i = 0; i < 3; i++) printf("%s %d\n", ppl[i].name, ppl[i].age);
return 0;
}Sortieren nach mehreren Schlüsseln
Um Gleichstände aufzulösen, vergleichen Sie ein zweites Feld, wenn das erste gleich ist. Dadurch wird zuerst nach Alter und anschließend alphabetisch nach Name sortiert.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct { char name[16]; int age; } Person;
int cmp(const void *a, const void *b) {
const Person *p = a, *q = b;
if (p->age != q->age)
return (p->age > q->age) - (p->age < q->age);
return strcmp(p->name, q->name);
}
int main(void) {
Person ppl[] = {{"Zoe", 30}, {"Amy", 30}, {"Bo", 25}};
qsort(ppl, 3, sizeof(Person), cmp);
for (int i = 0; i < 3; i++) printf("%d %s\n", ppl[i].age, ppl[i].name);
return 0;
}qsort ist nicht stabil
Der C-Standard verlangt nicht, dass qsort stabil ist. Wenn Sie Stabilität benötigen, fügen Sie Ihrer Vergleichsfunktion einen zusätzlichen Schlüssel zur Auflösung von Gleichständen hinzu, etwa den ursprünglichen Index.
Das Gegenstück bsearch
bsearch führt mithilfe derselben Art von Vergleichsfunktion eine binäre Suche in einem sortierten Array durch. Kombinieren Sie es mit qsort, um schnelle Suchen zu ermöglichen.
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void *a, const void *b) {
int x = *(const int *)a, y = *(const int *)b;
return (x > y) - (x < y);
}
int main(void) {
int a[] = {1, 3, 5, 7, 9};
int key = 7;
int *found = bsearch(&key, a, 5, sizeof(int), cmp_int);
printf("%s\n", found ? "found" : "missing");
return 0;
}Warum qsort verwenden
Das Standardverfahren qsort ist gut erprobt, verwendet häufig eine optimierte Introsort-Variante und funktioniert mit jedem Typ. Schreiben Sie nur dann eine eigene Sortierfunktion, wenn Sie Stabilität oder ein spezielles Verhalten benötigen, das die Bibliothek nicht bietet.
Kurzer Test
Testen Sie Ihr Verständnis von qsort.
Zusammenfassung
Sie haben gelernt, die Sortierfunktion der Standardbibliothek zu verwenden.
qsort(base, nmemb, size, compar)sortiert jedes Array- Vergleichsfunktionen wandeln
const void *um und geben das Vorzeichen des Vergleichs zurück - Vermeiden Sie Subtraktionen; verwenden Sie
(x > y) - (x < y) qsortist nicht garantiert stabil;bsearchist das zugehörige Suchverfahren
Häufig gestellte Fragen
Ist die Lektion „qsort verwenden“ kostenlos?
Ja — der vollständige Text von „qsort verwenden“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „qsort verwenden“?
Die Sortierfunktion der Standardbibliothek Du übst C Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C Academy zu starten?
Keine Vorkenntnisse erforderlich. C Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „qsort verwenden“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C Academy-Lektion Code schreiben und ausführen?
Ja. Jede C Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Bubble Sort und Insertion Sort
- Quicksort
- Mergesort
- qsort verwenden