0

我正在使用 Ubuntu Linux 进行编程。昨天我遇到了一个非常奇怪的问题,它真的很晦涩,很奇怪。

问题是我试图做冒泡排序,逻辑,语法一切都是正确的,但输出是错误的。我在 Windows 中编写了相同的程序,它运行良好。我在 Linux 中使用 Eclipse IDE。可能是什么问题?另一方面,我使用指针(通过引用调用)来完成冒泡排序,但在 Ubuntu 中输出也是错误的,而在 Windows 中输出还可以。我不知道怎么弄明白。

我的冒泡排序代码如下:

#include<stdio.h>

void main(void)
{
  int array[] = {4,2,6,3,1,5,8,4,6,1};
  int i=0;
  int j=0;
  for(i=1;i<=10;i++)
    {
      for(j=0;j<=10-i;j++)
        {
          if(array[j]>array[j+1])
            {
              int temp = array[j];
              array[j] = array[j+1];
              array[j+1] = temp;
            }
        }
    }
  for(i=0;i<=9;i++)
    {
      printf("%d\t",array[i]);
    }
}

输出:

gcc -o bubblesort.c -o output
./output


2 3 4 1 5 6 4 6 1 1
4

3 回答 3

4

超出数组的边界是未定义的行为(其中的一个子集是“正确地”行为),这就是程序正在发生的事情。数组使用从零开始的索引,这意味着最后一个有效索引比数组中的元素数小一:

/* 10 elements in 'array'. */
int array[] = {4,2,6,3,1,5,8,4,6,1};

for(j=0;j<=10-i ;j++)
{
    if(array[j]>array[j+1]) /* When 'j' is 9 the
                               'array[j + 1]' is
                               out of bounds. */

改变内for循环终止条件:

for(j=0;j<=9-i ;j++)

您可以使用而不是硬编码910整个代码sizeof(array)/sizeof(array[0])来获取array. 这使得以后更改元素的数量更不容易出错并且更简单array

const int ARRAY_SIZE = sizeof(array)/sizeof(array[0]);
于 2012-10-05T11:20:45.327 回答
2

这个:

for(j=0;j<=10-i;j++)

连同这个:

if(array[j]>array[j+1])

以及您越界访问阵列的其他地方可能是您出现问题的原因。

越界访问数组是未定义的行为

于 2012-10-05T11:22:05.253 回答
1

这是冒泡排序的伪代码:

for (i = 0; i < 9; i++) {
    for (j = i + 1; j < 10; j++) {
        if (element[i] > element[j]) swap_elements();
于 2012-10-05T11:23:24.933 回答