请给我详细解释一下这段程序 谢谢了!!!C语言的!

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;
for (i=0; i<n; i++) 语句在这里有什么作用我没有看出来 谢谢了!!!

这是一个数组的冒泡排序算法。
void fun(int bb[], int n)
{
int i, j, t;//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;
}
}
冒泡算法顾名思义,就是让最小的数一点一点被换到最前面来,当然如果比较的时候if (bb[j] > bb[j+1])这里用的是小于,那就是小的一点点被交换到后面去。
程序开始的时候首先让数组的第一个数和第二个数比较,如果第一个数较大,则交换它们,以此类推,把最大的一个数交换到最后,然后再找前面剩下的最大数放到倒数第二个位置,如此循环下去,直到循环完成,数组也就排序完成了。

对问题补充的回答:
楼主的这个算法还可以再优化一下,比如该数组一开始是:
5,2,4,8,9,7这样,
第一次内部循环开始,
j=0,5>2成立,所以交换,变成
2,5,4,8,9,7
j=1,5>4成立,所以交换,变成
2,4,5,8,9,7
j=2,5>8不成立,所以不用交换
2,4,5,8,9,7
j=3,8>9不成立,所以不用交换
2,4,5,8,9,7
j=4,9>7成立,所以交换,变成
2,4,5,8,7,9
第一次循环结束,把最大的9换到了最后。接下来还要依次找出第二大的,第三大的。。直到5次后,最终变成:
2,4,5,7,8,9,这就是第一个循环for (i=0; i<n; i++)的作用,因为一次内部循环只能把最大的第一个数交换到最后去,但是前面的还没有完成排序,所以总共需要数组个数的次数才能确保交换完毕。
其实上面这个数组还可以看出,外层循环只要运行两次,也就是当i=2的时候,数组就已经是按从小大大排列好了,所以,它有很多的时间都在做无用功。不管给定的数组是什么样的顺序,它都要做完双重循环,其实我们完全可以在程序中增加判断,如果内部循环一次下来,没有发生过交换,就说明,数组已经是排序好了,这时候就可以终止程序了,这样可以提高程序的效率,以下是优化过的冒泡排序算法:

#define bool int
#define false 0
#define true 1
void funSort(int aa[],int n)
{
int iCount=0;//用来记录排序所用次 数
int i,j,t;//i,j为数组下标变量,t为交换临时变量
bool bChange;//用来记录内层循环是否发生过交换,如果没有发生过交换,则说明数组已经是有序的,就可以终止排序了。
for(i=0;i<n;i++)//总共需要n次外层循环
{
bChange=false;//初值为false,没有发生过交换
for(j=n-1;j>0;j--)//从后往前比较,把最小的交换到前面去,就像气泡一样,冒到最上面。
{
iCount++;//循环计数器加1
if(aa[j]<aa[j-1])
{
bChange=true;//发生过交换,则继续比较
t=aa[j];//以下三行交换两个数
aa[j]=aa[j-1];
aa[j-1]=t;
}
}
if(!bChange) break;//如果没有发生过交换,则终止排序
}
printf("排序比较总次数:%d\n",iCount);//显示排序所用的次数
}

楼主可以自己在电脑上试一下,先输入一个已经排序好的数组(最好情况),看看排序总共进行了多少次比较,再输入一个逆序的数组(最坏情况),再看看进行了多少次比较.
还有不明白的,再交流,呵呵。可以发百度H消息给我。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-23
首先看到楼主这个程序的话,就明显的是冒泡法来排序数组。
但你的程序中有几个错误。这里我也不知道是你的错误还是我的错误,但可以肯定的是,如果你是用冒泡法来实现排序数组,那么你的程序定然存在错误。
首先你的int n,是数组的元素个数,还是bb[n]里面的那个n,一般这样的话n都必须是数组元素的个数,既如果是数组b[10],那么n必须取9。

而且你的第二个循环中的判断条件必须是j<9-i;这才是冒泡法的原理
正确的写法应该是
void fun(int bb[], int n)
{
int i, j, t;
for (i=0; i<n; i++)
for (j=0; j<n-i; j++)
if (bb[j] > bb[j+1])
{
t = bb[j];
bb[j] = bb[j+1];
bb[j+1] = t;
}
如果楼主真的是用冒泡法,而自己又不理解冒泡法,那么在这上面的解释估计你也懂不了。所以建议楼主去看谭浩强“c语言程序设计”第六章的“数组”会有详细的讲解冒泡法,比起我们在这里讲解要好的多。
祝你好运
第2个回答  2010-08-23
看起来,这个是一段冒泡排序的程序,按照从大到小的顺序排列