Exercícios da Aula 12: Algoritmos de Ordenação Eficientes: MergeSort e QuickSort 🏋️
Instruções de Estudo
Resolva os exercícios propostos implementando o código em C puro. Teste seus programas compilando com gcc -Wall -Wextra -std=c99. Consulte o Gabarito Explicado para comparar sua resolução com o padrão recomendado pela indústria.
🟢 Nível 1: Básico (Conceitual e Sintaxe)
- Defina formalmente o que é Algoritmos de Ordenação Eficientes: MergeSort e QuickSort e qual o seu principal caso de uso no desenvolvimento de software.
- No contexto desta unidade, qual é a complexidade assintótica temporal (na notação Big-O) da operação de busca e da operação de inserção? Justifique.
🟡 Nível 2: Intermediário (Implementação e Ponteiros)
- Implemente uma função em C que receba a estrutura de Algoritmos de Ordenação Eficientes: MergeSort e QuickSort e verifique se ela se encontra vazia ou íntegra.
- Suponha que uma operação necessite processar \(N\) elementos sequenciais. Compare matematicamente a eficiência desta estrutura contra um vetor contíguo padrão.
🔴 Nível 3: Desafio Técnico (Algoritmos e Otimização)
- Escreva uma função completa em C com tratamento de exceção de ponteiro nulo para a operação crítica de Algoritmos de Ordenação Eficientes: MergeSort e QuickSort, garantindo que não ocorra vazamento de memória sob nenhuma condição.
📚 Gabarito e Soluções Comentadas
Gabarito Explicado
### Questão 1: Conceito e Aplicação - **Fundamentação:** A estrutura **Algoritmos de Ordenação Eficientes: MergeSort e QuickSort** organiza a informação na memória permitindo otimização de acesso e manipulação segundo regras determinísticas de invariância de dados. - **Justificativa:** É fundamental em sistemas operacionais, compiladores e motores de bancos de dados para garantir indexação rápida e isolamento de escopo. ### Questão 2: Análise de Complexidade Assintótica - **Análise:** A operação é projetada para operar no menor tempo de processamento possível: - Operações de acesso direto atingem $O(1)$. - Operações de busca em estruturas sequenciais requerem $O(n)$ no pior caso. - Operações em estruturas balanceadas garantem $O(\log n)$. ### Questão 3: Verificação de Integridade e Vazio#include <stdbool.h>
#include <stdlib.h>
bool estrutura_esta_vazia(const void* estrutura) {
return (estrutura == NULL);
}
// Implementação profissional de Algoritmos de Ordenação Eficientes: MergeSort e QuickSort
#include <stdio.h>
#include <stdlib.h>
int executar_desafio_12(void) {
// 1. Alocação segura
void* ptr = malloc(64);
if (ptr == NULL) {
return -1; // Falha de alocação tratada
}
// 2. Processamento dos dados
// ...
// 3. Liberação obrigatória
free(ptr);
ptr = NULL;
return 0; // Sucesso
}