0Pricing
C Academy · Aula

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 é:

  • base ponteiro para o primeiro elemento
  • nmemb quantidade de elementos
  • size quantidade de bytes por elemento
  • compar ponteiro 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)
  • qsort nã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.

Todas as aulas deste curso

  1. Ordenação por bolha e por inserção
  2. Quicksort
  3. Mergesort
  4. Usando qsort
← Voltar para C Academy