Codigo

#include <iostream>
#include <conio.h>

using namespace std;

int main() {
    int numeros[] = {3, 2, 1, 5, 4};
    int n = 5; // Tamaño del array
    int gap, i, j, temp;

    // Algoritmo del Ordenamiento por Shell
    // Inicialmente, el gap es la mitad del tamaño del array
    gap = n / 2;

    while (gap > 0) {
        // Realizar una inserción con el gap actual
        for (i = gap; i < n; i++) {
            temp = numeros[i];
            j = i;

            // Mover los elementos que están más allá del gap
            // y que son mayores que temp, a la posición adelante
            while (j >= gap && numeros[j - gap] > temp) {
                numeros[j] = numeros[j - gap];
                j -= gap;
            }
            numeros[j] = temp;
        }

        // Reducir el gap
        gap /= 2;
    }

    // Imprimir array ordenado en orden ascendente
    cout << "Orden Ascendente: \n";
    for (int i = 0; i < n; i++) {
        cout << numeros[i] << " ";
    }
    cout << endl;

    // Imprimir array ordenado en orden descendente
    cout << "Orden Descendente: \n";
    for (int i = n - 1; i >= 0; i--) {
        cout << numeros[i] << " ";
    }
    cout << endl;

    getch();
    return 0;
}

Explicación del Código

  1. Inicialización del Gap:

    • Comienza con un gap igual a la mitad del tamaño del array.
  2. Ordenamiento por Shell:

    • Para cada gap, se realiza una inserción de elementos que están separados por ese gap.
    • El proceso de inserción es similar al de la ordenación por inserción, pero con un gap inicial y reduciendo gradualmente.
    • Se mueve el gap a la mitad en cada iteración hasta que sea 0.
  3. Impresión de Resultados:

    • Después de ordenar el array, se imprime en orden ascendente y descendente.