繁体   English   中英

C中的冒泡排序数组错误:第二个整数始终为零

[英]Bubble Sorted array Error in C: Second integer is Always Zero

我编写了一个程序来对长度不超过20个整数的数组进行冒泡排序,其内容由用户决定。 我遇到的问题是,当打印排序后的数组时,数组中的第二个整数始终为0,从而导致无法打印排序后的数组中的最大整数。 这是我的代码如下:

#include <stdio.h>

int main()
{
  int array[20];
  int n;
  int c;
  int d;
  float swap;
  printf("Please enter how many numbers you want to sort (up to 20):\n\t");
  scanf("%d", &n);
  if (n >= 2)
  {
    for (c = 0; c < n; c++)
    {
      printf("Please enter the next number:\n\t");
      scanf("%d", &array[c]);
    }
    for (c = 0; c < (n - 1); c++)
    {
      for (d = 0; d < (n - c); d++)
      {
        if (array[d] > array[d + 1])
        {
          swap = array[d];
          array[d] = array[d + 1];
          array[d + 1] = swap;
        }
      }
    }
    for (c = 0; c < n; c++)
    {
      printf("%d\n", array[c]);
    }
    printf("Here are the results in ascending order:\n");
  }
  else
  {
    printf("Since you have fewer than two numbers, they are already sorted!\n");
  }
  return 0;
}
for (d = 0; d < (n - c); d++)

这是不对的。 考虑一下六个数字(数组元素从零到五个,包括五个)的结果。

第一次通过交换循环, n将为6, c将为零。 这意味着d将取值为零到五个(包括五个)。

不幸的是,您正在交换索引dd + 1 ,因为您尚未填写索引,所以后者将是任意数据(索引六)。

由于您没有看到最后一位数字,而是看到了零,因此很可能(a)将您要填充的最后一位之外的元素设置为零。 这将导致交换代码将其与您的最后一个元素交换,从而导致您看到的内容:

0   1   2   3   4   5   6   7   8   9 <-- indexes
<--- you entered --->   remainder -->
3   1   4   1   5   9   0   0   0   0 <-- data
                    \___/
                        \
                         these will swap

应该使用的是:

for (d = 0; d < n - c - 1; d++)

这使得看到(b)与众不同:

1 0 1 3 4 5

和:

1 1 3 4 5 9

(a) 可能,但绝不能保证。 由于array是局部变量,因此它对未初始化的元素所取的值将是任意的。

如果您的代码有时可以正常工作,则是因为这样-您只需确保将数组元素都初始化为零,就可以得到可重复的失败:

int array[20] = {0};

然后,由于它是可复制的,因此您可以进行此答案中给出的更改以进行修复。


(b)顺便说一句,在这种情况下0不会一直冒泡到底部的原因是因为它是在第一遍过程中引入到数据中的。 这意味着要比对数据完全排序所需的传递少一遍。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM