2 - Preparación para programar en C

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.

2.1 Arrays en C como contenedores

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.

2.2 Paso de arrays a funciones

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.

2.3 Función swap()

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.

2.4 Función printArray()

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.

2.5 Organización modular en CLion (sort.h / sort.c / main.c)

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.