急:C语言中用冒泡发对10个一维数组按从小到大顺序排序,并输出。

#include<stdio.h>
main()
{
int a[10],i,j,temp;
printf("Please input 10 number:\n");
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}

for(i=0;i<9;i++)
for(j=0;j<10-i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}

for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n");

}

程序是可以运行的。 而且是升序排序。
-------------------------------------------------------------------------------------------------------
for(i=0;i<9;i++)
for(j=0;j<10-i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
问题1:当i=0时,j最大可以取到9。 如果j=9,那么if(a[j]>a[j+1)=if(a[9]>a[10]),a[10]不就越界了吗?

问题2:当i的值取最大8时,j<2, 那么j=0,j=1. 这是比较了2次啊,为什么说就比较了一次呢?

数组在内存中是顺序存储的,a[10]虽然越界,但是a[10]是有值的,你的程序升序排序能正确执行,你把if里面的>改成<,降序排序,程序就会出错,这是因为你的a[10]刚好是一个大数,a[9]>a[10]不成立,a[10]就没意义了。
要让你的程序无论升序还是降序都正确执行,改成
for(i=0;i<9;i++)
for(j=i;j<10-i-1;j++)
就行了
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-24
同学,首先解决问题1:
你的第一个问题分析的正确,a[10]的确越界了,这里越是你需要再处理一次的地方,每次其实J不应该到10-i而是10-i-1;为什么能够运行呢?
Vs是下不行的。VC 6下没有检查数据边界,所以可以正常运行。我这边调试的时候显示a[10]也就是你说的越界的那个元素的值默认为:1638280 所以呢,肯定不会因为if(a[j]>a[j+1])影响你的排序。

所以貌似可以正常运行。(你要是会调试肯定没有这个问题了)
问题2就是你理解的问题了,冒泡排序就是每次把最大的一个放到最后,那么下一轮就不需要该轮拍到最后的元素,例如 4 3 2 1变成 3 2 1 4 那么排的时候就不用考虑4了。到最后一轮时,本身只要排j=0的那么多拍了j=1 也是没有影响的,后面的都比之前的大,自然不要比较了啊!!!

说的也不是很清楚,希望可以解决你心头的疑惑。 求采纳哦!! (*^__^*) 嘻嘻……
第2个回答  2013-05-24

j不可能为9;这样你的两个问题都解决了!

#include<stdio.h>
main()
{
int a[10],i,j,temp;
printf("Please input 10 number:\n");
for(i=0;i<10;i++)
{
printf("a[%d]=",i);
   scanf("%d",&a[i]);
}

for(i=0;i<9;i++)
   for(j=0;j<9-i;j++)    //j<10-1-i   这里错了
       if(a[j]>a[j+1])
      {
        temp=a[j];
        a[j]=a[j+1];
        a[j+1]=temp;
       }

    for(i=0;i<10;i++)
       printf("%4d",a[i]);
    printf("\n");
}

第3个回答  2013-05-24
冒泡排序法,准确的形式应该是这样的:
for(i=0;i<9;i++)
for(j=0;j<10-i-1;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n");
第4个回答  2013-05-24
其实,是你的两个循环错了,for(i=0;i<9;i++) for(j=0;j<10-i;j++) 这两个循环应该这样写for(i=1;i<n;i++)
for(j=0;j<n-i;j++),因为是10个数,开始i=1,j<9,则循环是从j=0到j=8 ,这样循环9次,也就是第一个数和后面9个数做比较,以下依次比较到最后,输出结果。
相似回答