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

#include<stdio.h>main(){inta[10],i,j,temp;printf("Pleaseinput10number:\n");for(i=0;i<... #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次啊,为什么说就比较了一次呢?
展开
 我来答
龍__鳳
2013-05-24 · TA获得超过2346个赞
知道小有建树答主
回答量:948
采纳率:0%
帮助的人:1379万
展开全部
数组在内存中是顺序存储的,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++)
就行了
磐星
2013-05-24 · 超过20用户采纳过TA的回答
知道答主
回答量:72
采纳率:0%
帮助的人:48.2万
展开全部
同学,首先解决问题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 也是没有影响的,后面的都比之前的大,自然不要比较了啊!!!

说的也不是很清楚,希望可以解决你心头的疑惑。 求采纳哦!! (*^__^*) 嘻嘻……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友5bbf1ee
2013-05-24 · 超过24用户采纳过TA的回答
知道答主
回答量:63
采纳率:0%
帮助的人:66万
展开全部

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");
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
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");
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
数字化转型布道者
2013-05-24
知道答主
回答量:19
采纳率:0%
帮助的人:11.1万
展开全部
其实,是你的两个循环错了,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个数做比较,以下依次比较到最后,输出结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式