Ordenar arreglo de cadenas en C

En este post de programación en C te mostraré cómo ordenar un arreglo de cadenas de manera alfabética en orden ascendente. Es decir, ordenar un array de strings en C de la A a la Z.

Ordenar un arreglo de cadenas en C es distinto a hacerlo con uno de tipo numérico, pues para comparar cadenas usamos strcmp. Además, el tipo string no existe como tal, así que debemos usar arreglos de arreglos.

Lecturas recomendadas

Antes de continuar te recomiendo que leas la introducción a los arreglos de cadenas en C, así como al método de la burbuja con enteros.

De hecho podemos usar cualquier método que ordene arreglos, pero usaré el método de la burbuja para ordenar las cadenas porque es el método más sencillo de entender.

Ordenar arreglo de cadenas en C

Ordenar arreglo de cadenas alfabéticamente en C

La función recibe un arreglo de cadenas para ser ordenado y la longitud del arreglo, de ese modo podemos hacer un ciclo for que lo recorre. En cada paso, usamos strcmp para comparar las cadenas y realizar el ordenamiento.

En caso de que exista la necesidad de hacer el intercambio de valores usamos memcpy para intercambiar elementos de arreglos de cadenas en C.

Por lo tanto el método que ordena se ve así:

// Implementación del método de la burbuja en C, para arreglos de cadenas
void burbuja(char arreglo[][MAXIMA_LONGITUD_CADENA], int longitud)
{
    // Útil para hacer intercambio de cadenas
    char temporal[MAXIMA_LONGITUD_CADENA];
    int x, indiceActual;
    for (x = 0; x < longitud; x++)
    {
        for (indiceActual = 0; indiceActual < longitud - 1;
             indiceActual++)
        {
            int indiceSiguienteElemento = indiceActual + 1;
            // Si la cadena es mayor que la siguiente (alfabeticamente) entonces intercambiamos
            if (strcmp(arreglo[indiceActual], arreglo[indiceSiguienteElemento]) > 0)
            {
                // Movemos la cadena actual a la temporal
                memcpy(temporal, arreglo[indiceActual], MAXIMA_LONGITUD_CADENA);
                // Movemos al actual el siguiente elemento
                memcpy(arreglo[indiceActual], arreglo[indiceSiguienteElemento], MAXIMA_LONGITUD_CADENA);
                // Y en el siguiente elemento, lo que había antes en el actual pero ahora está en temporal
                memcpy(arreglo[indiceSiguienteElemento], temporal, MAXIMA_LONGITUD_CADENA);
            }
        }
    }
    // No hay necesidad de devolver nada, pues modificamos al arreglo de manera interna
}

Los comentarios ayudan a explicar el código. Básicamente ordena el arreglo y lo modifica internamente.

Poniendo todo junto

Anteriormente vimos el método en cuestión, ahora veamos cómo usarlo. Para ello primero declaramos un arreglo, calculamos su longitud y lo imprimimos para ilustrar:

char palabras[][MAXIMA_LONGITUD_CADENA] = {
  "Maria",
  "Luis",
  "Bojack",
  "Leon",
  "Maggie",
  "Link",
  "Mario",
  "Claire",
  "Zanahoria",
  "Baroness Von Bon Bon",
};
int longitud = sizeof(palabras)/sizeof(palabras[0]);
// Imprimimos el arreglo antes de ordenarlo, solo para ilustrar
printf("---Imprimiendo arreglo sin ordenar---\n");
int i;
for (i = 0; i < longitud; i++)
{
    printf("%s\n", palabras[i]);
}

Después, ordenamos el arreglo de cadenas en C invocando a burbuja y finalmente imprimimos el arreglo ya ordenado alfabéticamente:

// Lo ordenamos
burbuja(palabras, longitud);
// Volvemos a imprimir
printf("---Imprimiendo arreglo ordenado---\n");
for (i = 0; i < longitud; i++)
{
    printf("%s\n", palabras[i]);
}

El código completo queda así:

#include <stdio.h>
#include <string.h>
// Debe ser de la máxima + 1. Por ejemplo, si la máxima es 4, defínela como 5
#define MAXIMA_LONGITUD_CADENA 1000

// Implementación del método de la burbuja en C, para arreglos de cadenas
void burbuja(char arreglo[][MAXIMA_LONGITUD_CADENA], int longitud)
{
    // Útil para hacer intercambio de cadenas
    char temporal[MAXIMA_LONGITUD_CADENA];
    int x, indiceActual;
    for (x = 0; x < longitud; x++)
    {
        for (indiceActual = 0; indiceActual < longitud - 1;
             indiceActual++)
        {
            int indiceSiguienteElemento = indiceActual + 1;
            // Si la cadena es mayor que la siguiente (alfabeticamente) entonces intercambiamos
            if (strcmp(arreglo[indiceActual], arreglo[indiceSiguienteElemento]) > 0)
            {
                // Movemos la cadena actual a la temporal
                memcpy(temporal, arreglo[indiceActual], MAXIMA_LONGITUD_CADENA);
                // Movemos al actual el siguiente elemento
                memcpy(arreglo[indiceActual], arreglo[indiceSiguienteElemento], MAXIMA_LONGITUD_CADENA);
                // Y en el siguiente elemento, lo que había antes en el actual pero ahora está en temporal
                memcpy(arreglo[indiceSiguienteElemento], temporal, MAXIMA_LONGITUD_CADENA);
            }
        }
    }
    // No hay necesidad de devolver nada, pues modificamos al arreglo de manera interna
}

/*
	https://parzibyte.me/blog
*/

int main()
{
    char palabras[][MAXIMA_LONGITUD_CADENA] = {
        "Maria",
        "Luis",
        "Bojack",
        "Leon",
        "Maggie",
        "Link",
        "Mario",
        "Claire",
        "Zanahoria",
        "Baroness Von Bon Bon",
    };
    int longitud = sizeof(palabras) / sizeof(palabras[0]);
    // Imprimimos el arreglo antes de ordenarlo, solo para ilustrar
    printf("---Imprimiendo arreglo sin ordenar---\n");
    int i;
    for (i = 0; i < longitud; i++)
    {
        printf("%s\n", palabras[i]);
    }
    // Lo ordenamos
    burbuja(palabras, longitud);
    // Volvemos a imprimir
    printf("---Imprimiendo arreglo ordenado---\n");
    for (i = 0; i < longitud; i++)
    {
        printf("%s\n", palabras[i]);
    }
    return 0;
}

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *