C语言关于for循环的一个小问题~!!

来源:百度知道 编辑:UC知道 时间:2024/05/29 01:42:29
fun函数,功能是把数组bb中的数按从大到小排列,数组的值及元素个数从主函数中输入。
#include<stdio.h>
#define N 100
void fun(int bb[],int n)
{
int i,j,t;
for(i=0;i<n;i++)
for(j=0;j<n-1;j++)
if(bb[j]>bb[j+1])
{
t=bb[j];
bb[j]=bb[j+1];
bb[j+1]=t;
}
}
main()
{
int i=0,n=0;
int bb[N];
printf("\nInput n:\n");
scanf("%d",&n);
printf("\nInput data:\n");
while(i<n)
{
printf("b[%d]=",i);
scanf("%d",&bb[i]);
i++;
}
fun(bb,n);
printf("\n****the result****\n");
for(i=0;i<n,i++)
printf("%4d",bb[i]);
}
其中,第六行中i<n,这一行,定义了i的变化范围啊什么的,是什么作用呢?总感觉像是一句废话...呵呵,当然不能是废话,是我水平低...不懂啊,第六行到底是什么作用呢?也就是说i的存在是什么意思呢?大家快来帮帮我吧!
直接用j,也就是i的下一行的j的变化,也可能成为死循环吗?为什么呢?怎么就成了死循环?解释一下哦~太感谢 了!!

for(i=0;i<n;i++)
for(j=0;j<n-1;j++)
是循环嵌套,
实际上第六句是控制下面所有语句的:
for(j=0;j<n-1;j++)
if(bb[j]>bb[j+1])
{
t=bb[j];
bb[j]=bb[j+1];
bb[j+1]=t;
}
上面所有语句是进行一次冒泡,for(i=0;i<n;i++) 是控制冒泡次数的,
i每加1,上面的语句就运行一次,进行一趟冒泡,将最小的数字往最后“冒”,
进行n趟冒泡后,数组就有序了。
建议看看数据结构里边的冒泡算法!

i<n 是控制循环的
如果使用其他的可能造成死循环

有用,这种排序为冒泡法,想象一下
5 4 3 2 1

比如上面这5个数字我们把它按照由小到大的顺序排列,
从前往后相临两位比较大小,如果前一位比后一位大就把它俩
换位,5比4大就把5和4换位,得到45321
5又比3大 5和3换位 得到43521 依次类推最后得到
43215 这样就把最大的一个数字移到最后面了

然后不看5 ,剩下4321 再用上面的方法把4移动到最后
得到 32145 在不看45 剩下321 把3移动到
最后,依此类推。
最终得到12345

这就是冒泡法,是计算机编程排序中最简单快捷的方法。
除此意外我还能写出许多排序方法,但是效率上都不如冒泡法

至于为什么叫冒泡法呢,你把这几个数字竖起来看
1
2
3
4
5

把最大的数字5看成最大的泡泡,浮到最上,然后4又浮上去,依此类推
得到
5
4
3
2
1
所以形象的称为冒泡法
所以是需要双重循环的