C Academy · Lektion

Använda qsort

Sortering i standardbiblioteket.

Lektion 4 av 413 steg

Använda qsort är en gratis lektion i C Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C Academy innehåller totalt 4 lektioner.

Standardbibliotekets sortering

C:s standardbibliotek tillhandahåller qsort i <stdlib.h>. Den sorterar valfri array med hjälp av en jämförelsefunktion, så du behöver sällan skriva en egen sorteringsfunktion.

Signaturen för qsort

Prototypen är:

  • base pekare till det första elementet
  • nmemb antal element
  • size antal byte per element
  • compar pekare till en jämförelsefunktion

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

Skriva en jämförelsefunktion

Jämförelsefunktionen tar emot två const void *. Typomvandla dem till den riktiga typen, avreferera dem och returnera ett negativt värde, noll eller ett positivt värde.

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

Undvik subtraktion i jämförelsefunktioner

Att returnera x - y kan orsaka heltalsspill för stora heltal och ge felaktiga resultat. Använd i stället idiomet med skillnaden mellan booleska värden: (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;
}

Fallande ordning

För att sortera i fallande ordning vänder du helt enkelt på jämförelseresultatet.

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

Sortera strängar

För att sortera en array av char * tar jämförelsefunktionen emot pekare till pekarna. Typomvandla till const char * const * och anropa strcmp.

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

Sortera strukturer

Du kan sortera en array med strukturer efter valfritt fält. Här sorterar vi personer efter ålder.

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

Sortering efter flera nycklar

För att avgöra ordningen vid lika värden jämför du ett andra fält när det första är lika. Då sorteras posterna först efter ålder och sedan alfabetiskt efter namn.

#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 är inte stabil

C-standarden kräver inte att qsort är stabil. Om du behöver stabilitet kan du lägga till en skiljande nyckel, till exempel det ursprungliga indexet, i din jämförelsefunktion.

bsearch som komplement

bsearch utför en binärsökning i en sorterad array med samma typ av jämförelsefunktion. Kombinera den med qsort för snabba uppslagningar.

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

Varför använda qsort

Standardfunktionen qsort är vältestad, ofta en optimerad hybrid baserad på introsort och fungerar för alla typer. Skriv en egen sorteringsfunktion endast när du behöver stabilitet eller särskilt beteende som biblioteket inte kan erbjuda.

Snabbtest

Testa din förståelse av qsort.

Sammanfattning

Du har lärt dig att använda standardbibliotekets sortering.

  • qsort(base, nmemb, size, compar) sorterar valfri array
  • Jämförelsefunktioner typomvandlar const void * och returnerar jämförelsens tecken
  • Undvik subtraktion; använd (x > y) - (x < y)
  • qsort är inte garanterat stabil; bsearch är dess sökkomplement
Gratis att börja

Lär dig C med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
39
Lektioner
144

Vanliga frågor

Är lektionen ”Använda qsort” gratis?

Ja – hela texten till ”Använda qsort” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Använda qsort”?

Sortering i standardbiblioteket. Ni övar på C Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C Academy?

Du behöver inga förkunskaper. Utbildningen i C Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Använda qsort”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C Academy-lektionen?

Ja. Varje C Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Bubbel- och insättningssortering
  2. Quicksort
  3. Mergesort
  4. Använda qsort
← Tillbaka till C Academy