②我假设我现在从来没看过冒泡排序,和你一起分析一下这代码
③int a[N]= //初始化了乱序数组
int i,j,temp//嗯?i,j,temp干嘛的?我暂时不知道,因为我还没往下看,我先记着有这几个变量
for (j=0j<=N-2j++)
for(i=0i<=N-j-1i++)//出现两个嵌套循环,第一个是j从0到N-2 第二个是i从从0到N-j-i,如果没看后面,我仍然不知道i,j具体要干嘛,接着看
if (a[i]>a[i+1])
//这句就很明显了,当a[i]和a[i+1]不是大于关系,就让他们交换顺序,也就用到了之前的temp变量
//换句话说,就是任意相邻的a[i]和a[i+1]只要不是从小到大的顺序,就让相邻的元素从小到大
//后面的代码我知道,是循环并输出所有数组内元素
//再回头分析,我人脑模拟一下,当j=0,i从0到N-1,
当j=1,i从0到N-2,
.....
当j=N-2,i从0到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步时的效果,来推断整体效果。
(类似数学第一、第二归纳法)
一般分析复杂代码分两种:
循环逻辑复杂度分析:要用到循环不变式去判定
语义逻辑复杂度分析:要用到诸多编码技巧和经验,包括优先级等等。
*a在c语言中意思是:当a是一个指针的时候,*a就是这个指针指向的内存的值,在定义的时候加了*的都是指针变量,都是一个地址。扩展资料 在赋值的时候加了*的`都是表示这个指针指向内存的值,在等号前面就是给这个值赋值,后面就是取这个值。