Shell sort en C: ejercicio resuelto paso a paso

  3 minutos

Si buscas shell sort en C ejercicio resuelto, este ejemplo te ayuda a entender la lógica completa, no solo el código final.

Shell sort mejora la inserción directa usando saltos (gaps). En lugar de comparar siempre elementos contiguos, compara elementos alejados y va reduciendo el salto hasta llegar a 1. Es un algoritmo in-situ (no necesita un array auxiliar grande) y suele rendir mejor que burbuja o inserción directa en arrays medianos.

  1. Elige un gap inicial, normalmente n / 2.
  2. Recorre el array aplicando inserción directa, pero entre posiciones separadas por gap.
  3. Reduce el gap (gap /= 2) y repite.
  4. Cuando gap llega a 1, haces la última pasada equivalente a inserción directa clásica.

Implementa shell sort para ordenar un array de enteros en orden ascendente.

#include <stdio.h>

void shell_sort(int a[], int n) {
    for (int gap = n / 2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; i++) {
            int tmp = a[i];
            int j = i;

            while (j >= gap && a[j - gap] > tmp) {
                a[j] = a[j - gap];
                j -= gap;
            }
            a[j] = tmp;
        }
    }
}

int main(void) {
    int a[] = {29, 10, 14, 37, 13, 5, 42, 8};
    int n = (int)(sizeof(a) / sizeof(a[0]));

    shell_sort(a, n);

    for (int i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
    return 0;
}
5 8 10 13 14 29 37 42
  • Reducir mal el gap y quedarse en bucle infinito.
  • No guardar el valor temporal (tmp) antes de desplazar.
  • Usar condición incorrecta en el while y perder elementos.
  • Pensar que la complejidad es fija: depende de la secuencia de gaps.

Shell sort es útil cuando:

  • quieres una solución sencilla de implementar,
  • buscas mejor rendimiento que inserción directa sin usar mucha memoria,
  • trabajas con tamaños de entrada donde quicksort puede ser excesivo para un ejercicio didáctico.

Si quieres una ruta completa con progresión real de dificultad:

En muchos casos sí, porque adelanta trabajo con gaps grandes y deja menos desorden para la pasada final.

Depende de la secuencia de gaps. Con divisiones simples por 2 puede acercarse a O(n²), pero en práctica suele mejorar mucho frente a inserción directa.

Traza dos pasadas a mano con gap = n/2 y gap = n/4, luego compáralo contra inserción directa con el mismo array.