Introducción a algoritmos y estructuras de datos en Swift
Swift es un lenguaje de programación potente e intuitivo, creado por Apple para desarrollar aplicaciones para iOS, macOS, watchOS y tvOS. Sin embargo, para escribir código eficiente y rápido, no basta con conocer la sintaxis. Comprender los algoritmos y estructuras de datos es la base que transforma a un principiante en un desarrollador profesional.
En este artículo, analizaremos las estructuras de datos básicas (arrays, diccionarios, conjuntos) y los algoritmos clave (ordenamiento, búsqueda) en Swift. Todos los ejemplos de código están listos para ejecutarse en Xcode Playground.
Estructuras de datos principales en Swift
Swift proporciona estructuras de datos integradas que están optimizadas para el rendimiento y la gestión de memoria. Veamos las tres más importantes.
Arrays (Array)
Un array es una colección ordenada de elementos del mismo tipo. En Swift, los arrays están fuertemente tipados y tienen un orden fijo.
// Creación de un arrayvar numbers: [Int] = [1, 2, 3, 4, 5]
// Agregar un elementonumbers.append(6)
// Acceso por índicelet first = numbers[0] // 1
// Iteraciónfor number in numbers { print(number)}
// Ordenación in situnumbers.sort() // [1, 2, 3, 4, 5, 6]Los arrays son ideales cuando el orden de los elementos es importante y se necesita acceso rápido por índice (O(1)). Sin embargo, insertar o eliminar al inicio del array requiere tiempo O(n).
Diccionarios (Dictionary)
Un diccionario almacena pares "clave-valor". Las claves deben ser únicas y hashables (por ejemplo, String, Int).
// Creación de un diccionariovar scores: [String: Int] = ["Alice": 95, "Bob": 87]
// Agregar o actualizarscores["Charlie"] = 92
// Obtener un valor (opcional)if let aliceScore = scores["Alice"] { print("Puntaje de Alice: \\(aliceScore)")}
// Eliminarscores.removeValue(forKey: "Bob")Los diccionarios proporcionan acceso a un valor por su clave en O(1) en promedio. Úsalos cuando los datos se agrupen naturalmente por claves únicas.
Conjuntos (Set)
Un conjunto es una colección desordenada de elementos únicos. Es útil para verificar pertenencia y eliminar duplicados.
// Creación de un conjuntovar fruits: Set<String> = ["Manzana", "Banana", "Naranja"]
// Agregarfruits.insert("Mango")
// Verificar existenciaif fruits.contains("Manzana") { print("La manzana está en el conjunto")}
// Eliminar duplicados de un arraylet arrayWithDuplicates = [1, 1, 2, 3, 3, 4]let uniqueSet = Set(arrayWithDuplicates) // {1, 2, 3, 4}Algoritmos básicos en Swift
Ahora apliquemos las estructuras de datos para resolver problemas típicos. Veamos ordenamiento y búsqueda.
Algoritmos de ordenamiento
Swift tiene una función incorporada sort(), pero para entenderlo, escribamos el algoritmo clásico de ordenamiento rápido (Quick Sort).
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]Quick Sort es uno de los algoritmos más eficientes con una complejidad promedio de O(n log n). Para arrays pequeños, se puede usar el incorporado sorted().
Algoritmos de búsqueda
La búsqueda lineal es simple pero lenta (O(n)). Para datos ordenados, usa la búsqueda binaria (O(log n)).
// Búsqueda binariafunc binarySearch(_ array: [Int], target: Int) -> Int? { var low = 0 var high = array.count - 1 while low <= high { let mid = (low + high)