#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <windows.h>

void imprimir_lista(int lista[], int tamano)
{
    printf("[");
    for (int i = 0; i < tamano; i++)
    {
        if (i == tamano - 1)
        {
            printf("%d", lista[i]);
        }
        else
        {
            printf("%d, ", lista[i]);
        }
    }
    printf("]\n");
}

int main()
{
    // Zona de variables
    int tamano, numero;
    char continuar = ' ';

    // Establecer locale a UTF-8
    setlocale(LC_ALL, ".UTF-8");

    // Cambia la consola a UTF-8 para entrada y salida
    SetConsoleOutputCP(CP_UTF8);
    SetConsoleCP(CP_UTF8);

    // Limpieza de pantalla
    system("cls");

    // Grueso del programa
    printf("ORDENAMIENTO DE NÚMEROS POR BURBUJA\n");
    printf("\n¿Cuántos números vas a introducir? ");
    scanf("%d", &tamano);
    while (getchar() != '\n')
        ; // Limpieza de buffer

    while (tamano <= 0)
    {
        printf("\nLa lista de números no puede quedar vacía. ¿Cuántos números vas a introducir? ");
        scanf("%d", &tamano);
        while (getchar() != '\n')
            ; // Limpieza de buffer
    }

    // Asignar memoria dinámica para el arreglo
    int *numeros = malloc(tamano * sizeof(int));
    if (numeros == NULL)
    {
        printf("No se pudo asignar memoria.\n");
        return 1;
    }

    for (int i = 0; i < tamano; i++)
    {
        printf("\nIntroduce número %d: ", i + 1);
        scanf("%d", &numero);
        while (getchar() != '\n')
            ; // Limpieza de buffer
        numeros[i] = numero;
    }

    printf("\nLista original: ");
    imprimir_lista(numeros, tamano);

    // Algoritmo de ordenamiento por burbuja
    for (int i = 0; i < tamano - 1; i++)
    {
        for (int j = 0; j < tamano - i - 1; j++)
        {
            if (numeros[j] > numeros[j + 1])
            {
                int aux = numeros[j];
                numeros[j] = numeros[j + 1];
                numeros[j + 1] = aux;
            }
        }
    }

    printf("\nLista ordenada: ");
    imprimir_lista(numeros, tamano);
    printf("\n");

    // Liberar la memoria dinámica
    free(numeros);

    return 0;
}