C气泡排序算法

C气泡排序算法,c,C,下面的代码使用冒泡排序逻辑对字符串进行排序。我感到困惑的部分是for循环,我不确定为什么我被设置为1,为什么J被迭代直到小于n-J: #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")

下面的代码使用冒泡排序逻辑对字符串进行排序。我感到困惑的部分是for循环,我不确定为什么我被设置为1,为什么J被迭代直到小于n-J:

#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]);
}
#包括
#包括
void main()
{
字符名[25][50],临时[25];
int n,i,j;
printf(“\n\n使用冒号排序来设置数组的字符串:\n”);
printf(“-------------------------------------------------------------\n”);
printf(“输入字符串数:”);
scanf(“%d”和“&n”);
printf(“输入字符串%d:\n”,n);

对于(i=0;i,这段代码有一些细微的错误

  • 您运行的for循环超出了需要

    for(i=0;i<=n;i++)
    {
        fgets(name[i], sizeof name, stdin);
    }
    
  • 内部for循环从0变为
    n-i
    的原因是,在1个外部循环的末尾,最大的元素位于
    names[n-1]

    在2个外部循环之后,2个元素被排序为
    [n-2]
    [n-1]
    。因此无需检查这些元素


    等等。

    这段代码有一些细微的错误

  • 您运行的for循环超出了需要

    for(i=0;i<=n;i++)
    {
        fgets(name[i], sizeof name, stdin);
    }
    
  • 内部for循环从0变为
    n-i
    的原因是,在1个外部循环的末尾,最大的元素位于
    names[n-1]

    在2个外部循环之后,2个元素被排序为
    [n-2]
    [n-1]
    。因此无需检查这些元素


    依此类推。

    将算法的步骤与代码进行比较。您将看到原因。将算法的步骤与代码进行比较。您将看到原因。建议“您应该将其更改为scanf(“%d”、&n);”是一个问题,因为在
    int
    之后输入非空格后才会返回。这将迫使用户在看到
    printf(“输入字符串%d:\n”,n)之前输入一个输入字符串
    @chux-是的,我在测试时看到了这一点,但是字符串被正确地存储在缓冲区中。您有什么更好的建议吗?1)对所有输入使用
    fgets()
    ,或2)code
    scanf(“%d”,&n);
    (格式中没有空格)然后使用
    fgetc()
    阅读该行的其余部分。请详细说明此语句好吗?“此处,行尾仍保留在输入流中,并添加到名称[0]。您应该将其更改为scanf(“%d”,&n);”@用户3314399当您使用
    scanf
    读取整数时,比如说5,在键盘上按“5”,然后按“回车”键。使用
    scanf
    读取“5”,但回车键
    \n
    保留在输入缓冲区
    stdin
    下一次使用
    fgets
    读取时,只读取第一个
    \n
    并读取一个空行。建议“您应该将其更改为scanf(“%d”,&n);”是一个问题,因为在
    int
    之后输入非空格后才会返回。这将迫使用户在看到
    printf(“输入字符串%d:\n”,n)之前输入一个输入字符串
    @chux-是的,我在测试时看到了这一点,但是字符串被正确地存储在缓冲区中。您有什么更好的建议吗?1)对所有输入使用
    fgets()
    ,或2)code
    scanf(“%d”,&n);
    (格式中没有空格)然后使用
    fgetc()
    阅读该行的其余部分。请详细说明此语句,好吗?“此处,行尾保留在输入流中,并添加到名称[0]。您应该将其更改为scanf(“%d”,&n);“@user3314399当你用
    scanf
    读取一个整数时,比如说5,在键盘上按'5'然后按'Enter'键。用
    scanf
    读取'5',但回车键
    \n
    保留在输入缓冲区
    stdin
    下一次用
    fgets
    读取时,只读取第一个
    \n
    ,并读取一个空行。