Introdução: Por que algoritmos e estruturas de dados são a base da maestria em C#
Qualquer desenvolvedor que deseja escrever código eficiente e escalável em C#, mais cedo ou mais tarde, enfrenta a necessidade de entender como funcionam os algoritmos e as estruturas de dados. Isso não é apenas teoria acadêmica — é uma ferramenta que permite escolher a solução correta para uma tarefa específica: seja buscar um elemento em um milhão de registros, ordenar uma lista de pedidos ou processar dados em tempo real.
Neste artigo, vamos analisar os conceitos-chave com exemplos práticos em C# (.NET). Você aprenderá o que é complexidade de algoritmos (Big O), quais estruturas de dados estão embutidas no .NET e como usá-las. O material é voltado para iniciantes: começaremos com o simples e gradualmente nos aprofundaremos nos detalhes.
1. Fundamentos: O que são estruturas de dados e algoritmos em C#
1.1 Conceito de estrutura de dados
Estrutura de dados é uma forma de organizar e armazenar dados na memória do computador. Em C# (.NET), temos tanto estruturas embutidas (arrays, listas, dicionários) quanto a possibilidade de criar as próprias. A escolha correta da estrutura impacta diretamente o desempenho da aplicação.
1.2 Conceito de algoritmo
Algoritmo é uma sequência de passos para resolver uma tarefa. Por exemplo, o algoritmo de ordenação bolha ou a busca binária. É importante não apenas saber como escrever o código, mas também entender qual algoritmo escolher para um volume específico de dados.
1.3 Avaliação de complexidade (Notação Big O)
Big O descreve como o tempo de execução de um algoritmo cresce à medida que os dados de entrada aumentam. Principais notações:
O(1)— tempo constante (acesso a um elemento do array por índice)O(n)— tempo linear (busca em uma lista não ordenada)O(log n)— tempo logarítmico (busca binária)O(n²)— tempo quadrático (ordenação bolha)
Em C#, para medir o tempo de execução, pode-se usar System.Diagnostics.Stopwatch.
using System.Diagnostics;
int[] data = { 5, 3, 8, 1, 9 };Stopwatch sw = Stopwatch.StartNew();Array.Sort(data); // Ordenação embutida O(n log n)sw.Stop();Console.WriteLine($"A ordenação levou: {sw.ElapsedMilliseconds} ms");2. Principais estruturas de dados em C# (.NET)
2.1 Arrays (Array)
Array é um conjunto fixo de elementos do mesmo tipo. Em C#, os arrays são indexados a partir de zero. São ideais quando a quantidade de elementos é conhecida antecipadamente.
int[] numbers = new int[5] { 10, 20, 30, 40, 50 };Console.WriteLine(numbers[2]); // Saída: 30// Tentar acessar fora dos limites causará IndexOutOfRangeExceptionQuando usar: para acesso rápido por índice (O(1)). Não é adequado para adição/remoção frequente de elementos.
2.2 Lista (List<T>)
Array dinâmico do namespace System.Collections.Generic. Expande automaticamente ao adicionar elementos. É uma das estruturas mais populares em C#.
List<string> fruits = new List<string>();fruits.Add("Maçã");fruits.Add("Banana");fruits.Insert(1, "Laranja"); // Inserção na posição 1Console.WriteLine(fruits.Count); // Saída: 3Quando usar: quando for necessário adicionar elementos frequentemente ao final da lista (O(1) amortizado). Inserção no meio é O(n).
2.3 Dicionário (Dictionary<TKey, TValue>)
Coleção "chave-valor", baseada em tabela hash. Permite buscar rapidamente um valor pela chave.
Dictionary<string, int> ages = new Dictionary<string, int>();ages["Ana"] = 25;ages["Boris"] = 30;
if (ages.ContainsKey("Ana")){ Console.WriteLine($"Idade da Ana: {ages["Ana"]}"); // Saída: 25}Quando usar: para busca