Introducción
El ordenamiento es una operación fundamental en la programación y en la manipulación de datos. Consiste en reorganizar los elementos de una lista o arreglo en un orden específico, ya sea ascendente o descendente. Existen múltiples algoritmos de ordenamiento, cada uno con sus propias ventajas y desventajas en términos de eficiencia y complejidad.
En esta sección, exploraremos algunos de los algoritmos de ordenamiento más comunes:
- Ordenamiento por Burbuja (Bubble Sort)
- Ordenamiento por Selección (Selection Sort)
- Ordenamiento por Inserción (Insertion Sort)
- Ordenamiento Rápido (Quick Sort)
- Ordenamiento por Mezcla (Merge Sort)
- Ordenamiento por Burbuja (Bubble Sort)
Descripción
El ordenamiento por burbuja es uno de los algoritmos más simples. Funciona comparando pares de elementos adyacentes y los intercambia si están en el orden incorrecto. Este proceso se repite hasta que la lista está ordenada.
Ejemplo de Código
def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr # Ejemplo de uso lista = [64, 34, 25, 12, 22, 11, 90] print("Lista original:", lista) print("Lista ordenada:", bubble_sort(lista))
Explicación del Código
- Inicialización:
n
es la longitud de la lista. - Primer bucle: Itera desde
0
hastan-1
. - Segundo bucle: Compara elementos adyacentes y los intercambia si están en el orden incorrecto.
- Intercambio: Si
arr[j]
es mayor quearr[j+1]
, se intercambian los elementos.
Complejidad
- Peor caso: O(n²)
- Mejor caso: O(n) (cuando la lista ya está ordenada)
- Promedio: O(n²)
- Ordenamiento por Selección (Selection Sort)
Descripción
El ordenamiento por selección encuentra el elemento más pequeño (o más grande) de la lista y lo coloca en la primera posición. Luego, encuentra el siguiente más pequeño y lo coloca en la segunda posición, y así sucesivamente.
Ejemplo de Código
def selection_sort(arr): n = len(arr) for i in range(n): min_idx = i for j in range(i+1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr # Ejemplo de uso lista = [64, 25, 12, 22, 11] print("Lista original:", lista) print("Lista ordenada:", selection_sort(lista))
Explicación del Código
- Inicialización:
n
es la longitud de la lista. - Primer bucle: Itera desde
0
hastan-1
. - Segundo bucle: Encuentra el índice del elemento más pequeño en la sublista no ordenada.
- Intercambio: Coloca el elemento más pequeño en su posición correcta.
Complejidad
- Peor caso: O(n²)
- Mejor caso: O(n²)
- Promedio: O(n²)
- Ordenamiento por Inserción (Insertion Sort)
Descripción
El ordenamiento por inserción construye la lista ordenada de uno en uno, tomando cada elemento y colocándolo en su posición correcta dentro de la lista ordenada.
Ejemplo de Código
def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr # Ejemplo de uso lista = [12, 11, 13, 5, 6] print("Lista original:", lista) print("Lista ordenada:", insertion_sort(lista))
Explicación del Código
- Inicialización: Itera desde el segundo elemento hasta el final de la lista.
- Comparación e Inserción: Compara el elemento actual con los elementos de la lista ordenada y lo inserta en la posición correcta.
Complejidad
- Peor caso: O(n²)
- Mejor caso: O(n) (cuando la lista ya está ordenada)
- Promedio: O(n²)
- Ordenamiento Rápido (Quick Sort)
Descripción
El ordenamiento rápido es un algoritmo de divide y vencerás. Selecciona un "pivote" y reordena la lista de modo que todos los elementos menores que el pivote estén antes que él y todos los mayores estén después. Luego, aplica recursivamente el mismo proceso a las sublistas.
Ejemplo de Código
def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) # Ejemplo de uso lista = [3, 6, 8, 10, 1, 2, 1] print("Lista original:", lista) print("Lista ordenada:", quick_sort(lista))
Explicación del Código
- Condición base: Si la lista tiene uno o cero elementos, ya está ordenada.
- Selección del pivote: Elige el elemento central como pivote.
- Partición: Divide la lista en tres sublistas: menores, iguales y mayores que el pivote.
- Recursión: Aplica el mismo proceso recursivamente a las sublistas.
Complejidad
- Peor caso: O(n²) (cuando el pivote es el menor o mayor elemento)
- Mejor caso: O(n log n)
- Promedio: O(n log n)
- Ordenamiento por Mezcla (Merge Sort)
Descripción
El ordenamiento por mezcla es otro algoritmo de divide y vencerás. Divide la lista en dos mitades, las ordena recursivamente y luego las combina en una lista ordenada.
Ejemplo de Código
def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) def merge(left, right): result = [] i = j = 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result.extend(left[i:]) result.extend(right[j:]) return result # Ejemplo de uso lista = [38, 27, 43, 3, 9, 82, 10] print("Lista original:", lista) print("Lista ordenada:", merge_sort(lista))
Explicación del Código
- Condición base: Si la lista tiene uno o cero elementos, ya está ordenada.
- División: Divide la lista en dos mitades.
- Recursión: Ordena recursivamente cada mitad.
- Mezcla: Combina las dos mitades ordenadas en una lista ordenada.
Complejidad
- Peor caso: O(n log n)
- Mejor caso: O(n log n)
- Promedio: O(n log n)
Ejercicios Prácticos
Ejercicio 1: Implementar Bubble Sort
Implementa el algoritmo de ordenamiento por burbuja y prueba con la lista [5, 1, 4, 2, 8]
.
Ejercicio 2: Implementar Selection Sort
Implementa el algoritmo de ordenamiento por selección y prueba con la lista [29, 10, 14, 37, 13]
.
Ejercicio 3: Implementar Insertion Sort
Implementa el algoritmo de ordenamiento por inserción y prueba con la lista [12, 11, 13, 5, 6]
.
Ejercicio 4: Implementar Quick Sort
Implementa el algoritmo de ordenamiento rápido y prueba con la lista [3, 6, 8, 10, 1, 2, 1]
.
Ejercicio 5: Implementar Merge Sort
Implementa el algoritmo de ordenamiento por mezcla y prueba con la lista [38, 27, 43, 3, 9, 82, 10]
.
Conclusión
En esta sección, hemos explorado varios algoritmos de ordenamiento, cada uno con sus propias características y complejidades. Es importante entender cómo y cuándo utilizar cada algoritmo para optimizar el rendimiento de nuestras aplicaciones. Practicar la implementación de estos algoritmos te ayudará a comprender mejor sus mecanismos y a elegir el más adecuado para cada situación.
Fundamentos de la Programación
Módulo 1: Introducción a la Programación
- ¿Qué es la programación?
- Historia de la programación
- Lenguajes de programación
- Entornos de desarrollo