Introdução a Algoritmos e Estruturas de Dados em Swift
Swift é uma linguagem de programação poderosa e intuitiva, criada pela Apple para o desenvolvimento de aplicativos para iOS, macOS, watchOS e tvOS. No entanto, para escrever código eficiente e rápido, não basta apenas conhecer a sintaxe. Compreender algoritmos e estruturas de dados é a base que transforma um iniciante em um desenvolvedor profissional.
Neste artigo, abordaremos as estruturas de dados básicas (arrays, dicionários, conjuntos) e os principais algoritmos (ordenação, busca) em Swift. Todos os exemplos de código estão prontos para execução no Xcode Playground.
Principais Estruturas de Dados em Swift
O Swift fornece estruturas de dados integradas que são otimizadas para gerenciamento de memória e desempenho. Vamos analisar as três mais importantes.
Arrays (Array)
Um array é uma coleção ordenada de elementos do mesmo tipo. Em Swift, os arrays são fortemente tipados e possuem uma ordem fixa.
// Criando um arrayvar numbers: [Int] = [1, 2, 3, 4, 5]
// Adicionando um elementonumbers.append(6)
// Acesso por índicelet first = numbers[0] // 1
// Iteraçãofor number in numbers { print(number)}
// Ordenação in-placenumbers.sort() // [1, 2, 3, 4, 5, 6]Arrays são ideais quando a ordem dos elementos é importante e é necessário acesso rápido por índice (O(1)). No entanto, inserir ou remover no início do array requer tempo O(n).
Dicionários (Dictionary)
Um dicionário armazena pares "chave-valor". As chaves devem ser únicas e hasháveis (por exemplo, String, Int).
// Criando um dicionáriovar scores: [String: Int] = ["Alice": 95, "Bob": 87]
// Adicionando ou atualizandoscores["Charlie"] = 92
// Obtendo um valor (opcional)if let aliceScore = scores["Alice"] { print("Pontuação da Alice: \\(aliceScore)")}
// Removendoscores.removeValue(forKey: "Bob")Dicionários fornecem acesso a um valor por chave em O(1) em média. Use-os quando os dados são naturalmente agrupados por chaves únicas.
Conjuntos (Set)
Um conjunto é uma coleção não ordenada de elementos únicos. É útil para verificar pertinência e remover duplicatas.
// Criando um conjuntovar fruits: Set<String> = ["Apple", "Banana", "Orange"]
// Adicionandofruits.insert("Mango")
// Verificando existênciaif fruits.contains("Apple") { print("Apple está no conjunto")}
// Removendo duplicatas de um arraylet arrayWithDuplicates = [1, 1, 2, 3, 3, 4]let uniqueSet = Set(arrayWithDuplicates) // {1, 2, 3, 4}Algoritmos Básicos em Swift
Agora vamos aplicar as estruturas de dados para resolver problemas típicos. Vamos abordar ordenação e busca.
Algoritmos de Ordenação
Swift possui uma função embutida sort(), mas para entendimento, vamos escrever o algoritmo clássico de Quick Sort (Ordenação Rápida).
func quickSort(_ array: [Int]) -> [Int] { guard array.count > 1 else { return array } let pivot = array[array.count / 2] let less = array.filter { $0 < pivot } let equal = array.filter { $0 == pivot } let greater = array.filter { $0 > pivot } return quickSort(less) + equal + quickSort(greater)}
let unsorted = [3, 6, 1, 8, 2, 9, 4]let sorted = quickSort(unsorted)print(sorted) // [1, 2, 3, 4, 6, 8, 9]O Quick Sort é um dos algoritmos mais eficientes, com complexidade média O(n log n). Para arrays pequenos, pode-se usar o embutido sorted().
Algoritmos de Busca
A Busca Linear é simples, mas lenta (O(n)). Para dados ordenados, use a Busca Binária (O(log n)).
// Busca Bináriafunc binarySearch(_ array: [Int], target: Int) -> Int? { var low = 0 var high = array.count - 1 while low <= high { let mid = (low + high)