Antes de escribir MergeSort, QuickSort o HeapSort necesitamos una base común en C: cómo representar arrays, pasar datos entre funciones, reutilizar auxiliares y organizar el proyecto para iterar rápido.
Usaremos arrays de enteros contiguos como estructura de entrada. Separar el tamaño lógico del tamaño del buffer evita accesos fuera de rango:
#define MAX 100
int datos[MAX] = {42, 7, 18, 3, 25};
int cantidad = 5; /* elementos realmente usados */
Esta convencion se mantiene en todos los ejemplos para que las funciones conozcan hasta dónde iterar.
Un array pasado como parámetro decae a puntero. Por claridad, acompañamos siempre el puntero con su longitud:
void mergesort(int *valores, int inicio, int fin);
/* Llamado */
mergesort(datos, 0, cantidad - 1);
En las versiones iterativas (como HeapSort) usaremos la firma funcion(int *arr, int n). Mantener este contrato simplifica el cambio entre algoritmos.
Intercambiar elementos es esencial en QuickSort y HeapSort. Centralizamos el código para evitar errores:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
Colocaremos el prototipo en un header compartido para que cualquier algoritmo pueda reutilizarlo.
Imprimir el contenido antes y después de ordenar ayuda a validar cambios:
#include <stdio.h>
void printArray(const int *arr, int n) {
printf("[");
for (int i = 0; i < n; i++) {
printf("%d", arr[i]);
if (i + 1 < n) {
printf(", ");
}
}
printf("]\n");
}
Esta función no modifica los datos y sirve para todas las pruebas del tutorial.
Una estructura mínima para trabajar en CLion o en consola:
sort.h: prototipos de swap, printArray y las firmas de MergeSort, QuickSort y HeapSort.sort.c: definiciones compartidas (swap, printArray) y utilidades de soporte.mergesort.c, quicksort.c, heapsort.c: implementaciones independientes de cada algoritmo.main.c: punto de entrada para cargar datos de prueba, invocar un algoritmo y mostrar resultados.Separar cabeceras y fuentes permite compilar solo lo que cambia y facilita comparar algoritmos bajo la misma interfaz.