En esta primera lección definimos qué significa ordenar una colección de datos, por qué los algoritmos de ordenamiento son esenciales y cómo evaluaremos su eficiencia. Todos los ejemplos están pensados para compilar en C, con un estilo simple que facilita el depurado en cualquier IDE.
Ordenar es reorganizar los elementos de una colección según un criterio definido, ya sea ascendente o descendente. El criterio puede basarse en números, texto o incluso combinaciones (por ejemplo, primero por apellido y luego por nombre).
En la práctica, ordenar implica:
El ordenamiento aparece en casi todos los sistemas: mejora la búsqueda, simplifica la generación de reportes y permite agrupar datos antes de otros procesos. Algunas razones clave:
Todos los algoritmos de este tutorial se basan en tres operaciones básicas:
La función swap es tan frecuente que conviene tenerla lista desde el inicio:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
Con esta utilidad reducimos errores y facilitamos la lectura de los algoritmos que vendrán.
Usaremos la notación Big-O para describir cómo crece el tiempo de ejecución respecto al tamaño de la lista. Los algoritmos clásicos que veremos tienen complejidad O(n^2) en el peor caso porque realizan comparaciones dobles: una pasada externa y otra interna.
Al comparar algoritmos, nos fijaremos en:
Bubble, Insertion y Selection Sort son ideales para listas pequeñas o casi ordenadas, pero no escalan bien. Con colecciones grandes, el costo de O(n^2) se vuelve prohibitivo y conviene pasar a algoritmos de O(n log n), como merge sort o quick sort, o directamente usar las funciones de librería estándar.
En escenarios de producción siempre debemos preguntarnos: ¿el tamaño esperado de la lista justifica un algoritmo cuadrático? Si la respuesta es no, estos métodos pueden servir solo para prototipos o para entender los fundamentos antes de implementar alternativas más eficientes.