字符串数组中的冒泡排序算法运行时没有错误,但什么也不做

Bubble sort algorithm in an array of strings runs with no erros, but does nothing

本应将nombres中的30个名字按字母顺序排序,函数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);
}

它正确地显示了未排序的名字,冒泡函数做了这件事,然后它显示了所有相同的名字仍然未排序

...程序结束,退出代码为 0
按 ENTER 退出控制台

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() return 如果第一个字符串按字典顺序排在第二个之后,则该值大于零。

编辑:

正如 David C. Rankin 指出的那样,您可以将 mostrar() 函数的 return 类型设为 void,因为您没有 returning 任何值.

你的算法不是冒泡排序而是插入排序。

冒泡排序跟踪是否发生交换,如果发生交换,则重复比较相邻元素的过程,直到数组排序完成。

插入排序将第 i 个元素与下一个第 j 个元素进行比较,其中 j > i 直到数组末尾,如果第 i 个元素大于第 j 个元素,则发生交换。

barbuja() 中的第二个 for 循环的不变量也是错误的,而应该是 j < max,正如用户 9769953 所指出的那样,您应该使用一个函数字符串比较,例如 strcmp()strncmp()