字符串数组中的冒泡排序算法运行时没有错误,但什么也不做
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()
本应将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()