0Pricing
C Academy · Lektion

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:

  • base Zeiger auf das erste Element
  • nmemb Anzahl der Elemente
  • size Bytes pro Element
  • compar Zeiger 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)
  • qsort ist nicht garantiert stabil; bsearch ist 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

  1. Bubble Sort und Insertion Sort
  2. Quicksort
  3. Mergesort
  4. qsort verwenden
← Zurück zu C Academy