c - C 冒泡排序算法
问题描述
我有以下代码使用冒泡排序逻辑对字符串进行排序。我感到困惑的部分是 for 循环,我不确定为什么 i 被设置为 1 以及为什么 J 被迭代直到它小于 nj:
#include <stdio.h>
#include <string.h>
void main()
{
char name[25][50],temp[25];
int n, i, j;
printf("\n\nSorts the strings of an array using bubble sort :\n");
printf("-----------------------------------------------------\n");
printf("Input number of strings :");
scanf("%d",&n);
printf("Input string %d :\n",n);
for(i=0; i<=n; i++)
{
fgets(name[i], sizeof name, stdin);
}
/*Logic Bubble Sort*/
for(i=1; i<=n; i++)
{
for(j=0; j<=n-i; j++)
{
if (strcmp(name[j],name[j+1])>0)
{
strcpy(temp,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],temp);
}
}
}
printf("The strings appears after sorting :\n");
for(i=0;i<=n;i++)
printf("%s\n",name[i]);
}
解决方案
这段代码有一些微妙的问题
您正在运行 for 循环多于一个。
for(i=0;i<=n;i++) { fgets(name[i], sizeof name, stdin); }
上面那行的原因scanf("%d",&n);
在这里,行尾保留在输入流中并被添加到name[0]
. 你应该把它改成scanf("%d ",&n);
这将消耗同一语句中的行尾。此外,for 循环现在应该从for(i=0;i< n;i++)
.
此外,该fgets
函数接收的大小name
太大。它的大小应该是name[0]
iefgets(name[i], sizeof name[0], stdin);
现在,您的字符串正在从
name[0]
to存储,name[n-1]
并且可以修复排序算法的其余部分。for(i=0;i< n;i++){ for(j=0;j< n-i;j++) { if(strcmp(name[j],name[j+1])>0) { strcpy(temp,name[j]); strcpy(name[j],name[j+1]); strcpy(name[j+1],temp); } } } printf("The strings appears after sorting :\n"); for(i=0;i< n;i++) printf("%s",name[i]);
内部for循环从0到的原因n-i
是在1个外部循环的末尾,最大的元素在names[n-1]
在 2 个外部循环之后,对 2 个元素进行了排序[n-2]
,并且[n-1]
. 所以没有必要检查这些元素。
等等。
推荐阅读
- c# - 将 json 反序列化为具有泛型类型的基础对象
- bash - 运行程序避免覆盖输出
- python - 如何将for循环输出转换为python列表
- javascript - 在模态框上显示模态框,但第二个模态框正在关闭。离子 3
- reactjs - 根据呈现的内容更新导航面板样式
- android - Android:两部手机都在录制音频时,Skype 通话无法正常工作
- android - 登录用户的iandroid webview缓存问题
- perforce - Perforce,可以搁置提交的更改吗?
- linux - 如何将用户名附加到文件名中
- python - Ubuntu + Python:wlan0 上的 HTTP 客户端和 eth0 上的 TCP 服务器