首页 > 解决方案 > 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]);
}

标签: c

解决方案


这段代码有一些微妙的问题

  1. 您正在运行 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);

  1. 现在,您的字符串正在从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]. 所以没有必要检查这些元素。

等等。


推荐阅读