Алгоритм пузырьковой сортировки в массиве строк работает без ошибок, но ничего не делает - PullRequest
0 голосов
/ 18 мая 2019

Предполагается отсортировать 30 имен в nombres в алфавитном порядке, функция burbuja() выполняется, но после ее завершения все имена по-прежнему не отсортированы

#include <string.h>
#include <stdio.h>

#define max 30

int mostrar(char nombres[max][80])
{
    int i;
    printf("\nLa pila ahora tiene los siguentes elementos\n");
    for(i = 0; i < max; i++)
        printf("%s\n",nombres[i]);
}

void burbuja(char nombres[max][80]) //part that does not work
{
    int i, j;
    char aux[80];
    for (i = 0; i < max; i++)
    {
        for (j = i + 1; j < max - i - 1; j++)
        {
            if(nombres[j - 1] > nombres[j])
            {
                strcpy(aux, nombres[j - 1]);
                strcpy(nombres[j - 1], nombres[j]);
                strcpy(nombres[j], aux);
            }
        }
    }
}

int main()
{
    char nombres[30][80] = {
        "Javier", "Paola", "Paco", "Pedro", "Jorge", "Luis", "Champ",
        "Alma", "Alicia", "Stephanie", "Mark", "Daniel", "Hank", "Malcom",
        "Jaime", "Luisa", "Lila", "Beatriz", "Teresa", "Maria", "Michel", 
        "Karina", "Karen", "Carmen", "Juan", "Daniela", "Ana", "Gavin",
        "Rosa", "Francisco"
    };

    mostrar(nombres);
    burbuja(nombres);
    mostrar(nombres);
}

отображает правильно отсортированные имена, функция bubble работает, затем показывает все те же имена, которые еще не отсортированы

... Программа завершена с кодом выхода 0
Нажмите клавишу ВВОД для выхода из консоли

Ответы [ 2 ]

1 голос
/ 18 мая 2019

В nombres[j - 1] > nombres[j] и nombres[j-1], и nombres[j] являются символьными массивами.И имя массива само по себе превращается в указатель на первый элемент этого массива.

Итак, nombres[j - 1] > nombres[j], вы просто сравниваете указатели с первым элементом из двух массивов..

Вам нужна такая функция, как strcmp().

И for (j = i + 1; j < max - i - 1; j++) не будет охватывать весь массив должным образом.

Попробуйте что-то вроде

for (i=0; i<max; i++)
{
    for (j=0; j<max-1-i; j++)
    {
        if(strcmp(nombres[j], nombres[j+1])>0)
        {
            strcpy(aux, nombres[j]);
            strcpy(nombres[j], nombres[j+1]);
            strcpy(nombres[j+1], aux);
        }
    }
}

strcmp() возвращает значение больше нуля, если первая строка идет после второй в лексикографическом порядке.

Редактировать:

As David CРанкин указал, что вы можете сделать тип возврата функции mostrar() равным void, так как вы не возвращаете никакого значения.

0 голосов
/ 18 мая 2019

Ваш алгоритм не пузырьковая сортировка, а вставка сортировки.

Bubble sort отслеживает, произошел ли обмен, и если да, то повторяет процесс сравнения соседних элементов до сортировки массива.

Сортировка вставки сравнивает первый i-й элемент со следующим j-м, где j> i до конца массива, если i-й элемент больше, чем j-й элемент, то происходит перестановка.

Также неверен инвариант для вашего второго for цикла внутри barbuja(), скорее, он должен быть j < max, и, как указал пользователь 9769953, вы должны использовать функцию, которая выполняет сравнение строк, например strcmp() или strncmp()

...