【问题标题】:Bubble Sorting Program, Works in DM compiler(on windows) & not on GCC(Ubuntu)冒泡排序程序,在 DM 编译器中工作(在 Windows 上)而不是在 GCC(Ubuntu)上
【发布时间】:2011-09-18 16:40:05
【问题描述】:

我在 C 中制作了这个冒泡排序算法。它在 DM 中运行良好,但在 gcc 中执行时,输出不正确。

#include <stdio.h>

int i,j;

void BubbleSort(int*a, int n) //to sort the numbers
{
    int temp;
    for(i=0; i<n;i++)
        for(j=n; j>i;j--)
            if (a[j]<a[j-1])
                {
                    temp=a[j];
                    a[j]=a[j-1];
                    a[j-1]=temp;
                }
}

void Display(int * a, int n) //to display
{
    printf("\nThe sorted numbers are:\n");
    for(i=0;i<n;i++)
        {
            printf("%d, ",a[i]);
        }
}

int main()
{
    int a[50],n,choice;
    printf("\nEnter no. of elements to sort: (max. 50) ");
    scanf("%d",&n);
    printf("\nEnter the numbers : ");

    for(i=0;i<n;i++)
        scanf("%d",&a[i]);

    BubbleSort(a,n);
    Display(a,n);

    return 0;

} //End of main

输入:

5
2 1 5 3 4

DM 输出:

1, 2, 3, 4, 5,

GCC 输出:

1, 2, 3, 5, 4,

这是如何以及为什么会发生的?

【问题讨论】:

  • 您是否尝试过在调试器中单步执行?还是打印变量的中间值?
  • 您正在访问循环中数组的 (n+1)th 元素:a[j]a[5],而 j 从 5 变为 i。但是一个有 5 个元素的数组,没有索引 5
  • 在任何情况下使用全局变量 ij 都是令人震惊的(使用单字母全局变量的理由很少),而且当它只是一种方式时更是如此避免声明循环变量。 C99 允许您编写:for (int i = 0; ...) 等。
  • 这也是一个糟糕的UI,需要您统计要排序的项目数才能输入。计算机擅长计数。 (如果你必须告诉它每个文件中有多少行数据,你不会使用 Unix sort 命令!)
  • @Keith:我一直使用ij;投诉不仅仅是关于名称,而是关于使用具有全球地位的名称。我明确地说C99;如果您的编译器不是 C99,那么它将不支持该符号。 (因为这个问题在 Ubuntu 上引用了 GCC,所以这不是问题,除非你通过强制 C89 模式来阻碍它。)我不愿评论“它们应该是static,所以在这个源文件之外看不到它们” ;我也不愿评论排序函数中temp 的不必要的大范围。

标签: c gcc bubble-sort dm


【解决方案1】:

这完全可行的事实是值得怀疑的。您超出了这一行的原始数组:

if (a[j]<a[j-1])  // sketchy when j==n

您正在比较一个尚未初始化的值,因此a[n] 处的值就是初始化时的值。

这一行:

for(j=n; j>i;j--)

应该是:

for(j=n-1; j>i;j--)

【讨论】:

  • 嘿谢谢!!这是一个逻辑错误......但现在我试图弄清楚为什么它在数字火星编译器上工作! ://
  • @Ashwini:行为未定义,所以任何事情都可能发生。 “正确”工作实际上是最糟糕的结果。
  • 同意“最坏结果”部分。如果我没有再次在 GCC 上测试它,我可能永远不会意识到这个错误。现在我知道为什么人们通常更喜欢 GCC。
  • 有趣。我知道 UB 可能会导致任何事情,但我对这个错误如何导致所描述的输出有点困惑。 a[5] 会有一个不确定的值,但在我曾经使用过的任何系统上,它都会是 some 值。该值会冒泡到输出中(如果它是&lt;5),或者不会。我看不出这个特定的错误会如何导致“排序”数组最终像问题中那样,所以我想知道还有什么我看不到的。
  • @MichaelBurr 想到什么了吗??我仍然想知道为什么没有随机值出现......
猜你喜欢
  • 2022-11-30
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多