请大虾解释下用for循环语句排序时是如何循环?循环几次?

来源:百度知道 编辑:UC知道 时间:2024/06/02 03:01:45
void main()
{
int i,j,p,q,s,a[4];
printf("\n input 4 numbers:\n");
for(i=0;i<4;i++)
scanf("%d",&a[i]); (分别输入5、7、3、6)
for(i=0;i<4;i++){
p=i;q=a[i];
for(j=i+1;j<4;j++)
if(q<a[j]) { p=j;q=a[j]; }
if(i!=p)
{s=a[i];
a[i]=a[p];
a[p]=s; }
printf("%d",a[i]);
}
}
我的理解是:a[0]=5跟a[1]=7比较后互换,接着a[1]=5与a[2]=3比较后不变继续保持各自的原值,再接着a[2]=3与a[3]=6比较后两者又互换, 然后i=3,j=4于是跳过第二个for循环,最后循环终止 得a[0]=7、a[1]=5、a[2]=6、a[3]=3,最后a[i]输出为 7 5 6 3 (共循环4次:i=0循环一 次,i=1算循环第二次,以此类推)
而程序运行结果是:7 6 5 3
那么,我到底哪里理解错了呢,请大虾指教

你错在没有将循环做完就进入了下一次循环。a[0]=5跟a[1]=7比较后互换,接下来的不是a[1]=5与a[2]=3比较而是a[0]=7与a[2]=3,a[3]=6的比较。虽然比较后它们并没有作任何互换,但机器还是这样做了,而你的人脑却只比较了一次就跳到下一次循环去了。到这里倒还没出现什么问题,可接下来就出问题了。
比较完a[1]=5与a[2]=3后,系统会继续比较a[1]=5和a[3]=6的值,而你呢,又跳到下一次循环上去了,这样就少做了一次交换,以后的就都错了。

你写的好烂
应该这么些
for(i=0;i<4;i++)
for(j=i+1;j<4;j++)
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=a[i];
}
其中t为整形变量;即可;这是直接排序法。

你这个程序本身就是一个排序的代码
再接着的时候a[2]是=5而不是3
如果a[1]=5与a[2]=3比较后不变继续保持各自的原值
需要从新一和循环才可以