qsort gebruiken
Sorteren met de standaardbibliotheek
qsort gebruiken is een gratis C Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C Academy bevat in totaal 4 lessen.
De sorteerfunctie uit de standaardbibliotheek
De standaardbibliotheek van C biedt qsort in <stdlib.h>. Hiermee wordt elke array gesorteerd op basis van een vergelijkingsfunctie, zodat u zelden zelf een sorteerfunctie hoeft te schrijven.
De signatuur van qsort
Het prototype is:
baseaanwijzer naar het eerste elementnmembaantal elementensizeaantal bytes per elementcomparaanwijzer naar een vergelijkingsfunctie
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
Een vergelijkingsfunctie schrijven
De vergelijkingsfunctie ontvangt twee const void *. Zet ze om naar het werkelijke type, derefereer ze en retourneer een negatieve waarde, nul of een positieve waarde.
#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;
}Vermijd aftrekken in vergelijkingsfuncties
Het retourneren van x - y kan bij grote gehele getallen een overflow veroorzaken, met onjuiste resultaten als gevolg. Gebruik in plaats daarvan de idiomatische vergelijking van booleaanse waarden: (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;
}Aflopende volgorde
Keer voor aflopend sorteren eenvoudig het resultaat van de vergelijking om.
#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;
}Tekenreeksen sorteren
Bij het sorteren van een array met char * ontvangt de vergelijkingsfunctie aanwijzers naar de aanwijzers. Zet ze om naar const char * const * en roep strcmp aan.
#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;
}Structs sorteren
U kunt een array met structs sorteren op elk veld. Hier ordenen we personen op leeftijd.
#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;
}Sorteren op meerdere sleutels
Vergelijk om gelijke waarden te onderscheiden een tweede veld wanneer het eerste gelijk is. Zo wordt eerst op leeftijd en daarna alfabetisch op naam gesorteerd.
#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 is niet stabiel
De C-standaard vereist niet dat qsort stabiel is. Als u stabiliteit nodig hebt, voegt u een sleutel toe om gelijke waarden te onderscheiden, zoals de oorspronkelijke index, en gebruikt u die in uw vergelijkingsfunctie.
Bijbehorende bsearch-functie
bsearch voert met dezelfde stijl van vergelijkingsfunctie een binaire zoekopdracht uit op een gesorteerde array. Combineer deze functie met qsort voor snelle zoekopdrachten.
#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;
}Waarom qsort gebruiken
De standaardfunctie qsort is grondig getest, vaak een geoptimaliseerde combinatie met introsort en werkt met elk type. Gebruik alleen een eigen sorteerfunctie als u stabiliteit of speciaal gedrag nodig hebt dat de bibliotheek niet biedt.
Korte controle
Test uw begrip van qsort.
Samenvatting
U hebt geleerd hoe u de sorteerfunctie uit de standaardbibliotheek gebruikt.
qsort(base, nmemb, size, compar)sorteert elke array- Vergelijkingsfuncties zetten
const void *om en retourneren het teken van de vergelijking - Vermijd aftrekken; gebruik
(x > y) - (x < y) qsortis niet gegarandeerd stabiel;bsearchis de bijbehorende zoekfunctie
Leer C met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 39
- Lessen
- 144
Veelgestelde vragen
Is de les “qsort gebruiken” gratis?
Ja — de volledige tekst van “qsort gebruiken” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C Academy bevat in totaal 4 lessen.
Wat leer ik in “qsort gebruiken”?
Sorteren met de standaardbibliotheek Je oefent met C Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C Academy te beginnen?
Ervaring vooraf is niet nodig. C Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “qsort gebruiken”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C Academy?
Ja. Elke les over C Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Bubble sort en insertion sort
- Quicksort
- Mergesort
- qsort gebruiken