C语言冒泡排序问题。下面是程序,求每一步的解释。还有j在里面是什么意思

#include <stdio.h>
#define N 8
int main ()
{
int a[N]={9,8,3,7,5,2,6,1};
int i,j,temp;
/***冒泡排序***/
for (j=0;j<=N-2;j++)
{
for(i=0;i<=N-j-1;i++)
if (a[i]>a[i+1]) {temp=a[i];a[i]=a[i+1];a[i+1]=temp;}
}
/***输出结果***/
printf ("\n排序结果:");
for (i=0;i<=N-1;i++)
printf("%3d",a[i]);
printf ("\n");
return 0;
}

①看懂不管什么代码都有一些非常有意思的技巧

②我假设我现在从来没看过冒泡排序,和你一起分析一下这代码

③int a[N]={9,8,3,7,5,2,6,1}; //初始化了乱序数组
int i,j,temp; //嗯?i,j,temp干嘛的?我暂时不知道,因为我还没往下看,我先记着有这几个变量
for (j=0;j<=N-2;j++)
for(i=0;i<=N-j-1;i++)//出现两个嵌套循环,第一个是j从0到N-2 第二个是i从从0到N-j-i,如果没看后面,我仍然不知道i,j具体要干嘛,接着看
if (a[i]>a[i+1]) {temp=a[i];a[i]=a[i+1];a[i+1]=temp;}
//这句就很明显了,当a[i]和a[i+1]不是大于关系,就让他们交换顺序,也就用到了之前的temp变量
//换句话说,就是任意相邻的a[i]和a[i+1]只要不是从小到大的顺序,就让相邻的元素从小到大

//后面的代码我知道,是循环并输出所有数组内元素

//再回头分析,我人脑模拟一下,当j=0,i从0到N-1,【从a[0]到a[N-1]之间的相邻元素会对比换序】
当j=1,i从0到N-2,【从a[0]到a[N-2]之间的相邻元素会对比换序】
.....
当j=N-2,i从0到1,【a[0]和a[1]对比换序】
结束循环

//我们再看一下,每次对比换序会有什么影响,由于相邻元素对比换序会导致扫描到的最右边那个元素为最大值
//所以,当j=0,我们得到了a[N-1]是最大值,j=1得到了a[N-2]是第二大值...依此类推
//等j扫描完了,我们就得到了a[N-1]到a[0]分别是最大值,第二大值,第三大值...最小值

④以上分析隐含了什么技巧?其实就是《算法导论》中的一个定理:循环不变式
循环不变式:当你证明循环中i=0,1是对的,以及n是对的,并且都符合同样的规则,那么这个循环整个就是对的。
同样,你能用循环不变式通过归纳出i=0,1步,n步时的效果,来推断整体效果。
(类似数学第一、第二归纳法)
一般分析复杂代码分两种:
循环逻辑复杂度分析:要用到循环不变式去判定
语义逻辑复杂度分析:要用到诸多编码技巧和经验,包括优先级等等。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-20
冒泡排序原理懂不?
你这第一个for循环是用来控制执行次数的。。
第二个for循环执行目的两两比较是大数往后移,这样
第一次是把最大放到最后一位,第二次是第二大数放到最后第二位。。。以此类推
自己体会吧
相似回答