在C中填充数组时排序

时间:2017-02-04 02:50:20

标签: c arrays sorting

我对此代码有疑问:当我输入一个负值作为输入的第一个值时,程序将其替换为0.如果我在其他地方输入它,它可以正常工作。为什么会这样?我该如何解决?提前谢谢!

#include <stdio.h>
#define N 5

int main () {
  float a[N], temp;
  int i, j;

  for (i=0; i<N; i++) {
    scanf ("%f", &a[i]);
    for (j=0; j<N; j++)
      if (a[i]<a[j]) {
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
      }
  }
  for (i=0; i<N; i++)
    printf ("%.2f  ", a[i]);

  return 0;
}

2 个答案:

答案 0 :(得分:2)

你非常接近。正如其他人提到的那样,问题是a未被初始化,所以在你填充它之前它已经充满了垃圾。但是如果你初始化它会充满零,这将搞乱排序。

诀窍是只排序到你填充的地方。那将是i

for (i=0; i < N; i++) {
    scanf ("%f", &a[i]);
    for (j=0; j < i; j++) {
        if (a[i]<a[j]) {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
        }
    }
}

注意它是j < i。它不是j <= i因为将元素与自身进行比较没有意义

顺便说一句,这是一种低效的排序方式。它基本上是bubble sort,但与泡泡排序不同,如果数组已排序,它可以提前停止,你将始终进行快速变大的((n-1)*n)/2操作。在100个元素处,您正在进行4950次比较。

你最好阅读所有内容并整理整个列表。

答案 1 :(得分:0)

内部循环(具有索引j的内部循环)完全未定义,因为它在a中的所有值都已初始化之前迭代a

要解决此问题,您需要将数组的填充分隔为自己的循环,然后对其进行进一步处理。从行:

   if (a[i]<a[j]) {
        temp=a[i];
       a[i]=a[j];
        a[j]=temp;  
  }

我猜你正在尝试实施冒泡排序。这个 需要两个嵌套循环,但你现在的方式是错误的 - 数组填充需要独立,然后才开始排序,如前所述。