Usando qsort
A ordenação da biblioteca padrão.
Usando qsort é uma aula grátis de C Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.
A ordenação da biblioteca padrão
A biblioteca padrão de C fornece qsort em <stdlib.h>. Ela ordena qualquer vetor usando uma função de comparação, portanto raramente é necessário escrever sua própria ordenação.
A assinatura de qsort
O protótipo é:
baseponteiro para o primeiro elementonmembquantidade de elementossizequantidade de bytes por elementocomparponteiro para uma função de comparação
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
Escrevendo um comparador
O comparador recebe dois const void *. Converta-os para o tipo real, desreferencie-os e retorne um valor negativo, zero ou positivo.
#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;
}Evite subtração nos comparadores
Retornar x - y pode causar overflow com inteiros grandes, produzindo resultados incorretos. Em vez disso, use o padrão da diferença entre valores booleanos: (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;
}Ordem decrescente
Para ordenar em ordem decrescente, basta inverter o resultado da comparação.
#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;
}Ordenando strings
Para ordenar um vetor de char *, o comparador recebe ponteiros para os ponteiros. Converta para const char * const * e chame 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;
}Ordenando estruturas
Você pode ordenar um vetor de estruturas por qualquer campo. Aqui, ordenamos as pessoas por idade.
#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;
}Ordenação por múltiplas chaves
Para desempatar, compare um segundo campo quando o primeiro for igual. Assim, a ordenação é feita por idade e depois pelo nome em ordem alfabética.
#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 não é estável
O padrão de C não exige que qsort seja estável. Se precisar de estabilidade, adicione uma chave de desempate (como o índice original) ao seu comparador.
O recurso bsearch
bsearch realiza uma busca binária em um vetor ordenado, usando o mesmo estilo de comparador. Combine-o com qsort para obter buscas rápidas.
#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;
}Por que usar qsort
O qsort padrão foi amplamente testado, costuma ser uma implementação híbrida de introsort otimizada e funciona com qualquer tipo. Use sua própria ordenação somente quando precisar de estabilidade ou de um comportamento especial que a biblioteca não ofereça.
Verificação rápida
Teste sua compreensão de qsort.
Recapitulação
Você aprendeu a usar a ordenação da biblioteca padrão.
qsort(base, nmemb, size, compar)ordena qualquer vetor- Os comparadores convertem
const void *e retornam o sinal da comparação - Evite subtração; use
(x > y) - (x < y) qsortnão tem estabilidade garantida;bsearché seu recurso de busca complementar
Perguntas Frequentes
A aula “Usando qsort” é grátis?
Sim — o texto completo de “Usando qsort” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.
O que vou aprender em “Usando qsort”?
A ordenação da biblioteca padrão. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C Academy?
Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Usando qsort”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C Academy?
Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.