Använda qsort
Sortering i standardbiblioteket.
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:
basepekare till det första elementetnmembantal elementsizeantal byte per elementcomparpekare 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
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
- Bubbel- och insättningssortering
- Quicksort
- Mergesort
- Använda qsort