int main(){
int i,j,temp;
int a[]={3,2,4,7,1};
for(i=1;i<5;i++){
temp=a[i];
for(j=i-1;j>=0;j--){
if(a[j]>temp)
a[j+1]=a[j];
else
break;
}
a[j+1]=temp;//if I replace this by a[i] I am getting wrong output.
}
for(i=0;i<5;i++)
printf("\n\n%d",a[i]);
return 0;
}
在内循环中,我没有改变变量i的值。然后,如果我替换a[j+1]=a[i]
,我输错了。我错过了一些重要的概念吗?
答案 0 :(得分:5)
你的程序对我来说是正确的,但评论显示你并不理解这个意图。内循环将以前在索引之间的元素严格地移动到j
(最终值)和i
之间的一个位置,从而破坏a[i]
的旧值。该值已在temp
中留出,因此应将temp
而不是a[i]
分配给已释放的广告位a[j+1]
,这是该计划的作用。
由于极端情况有时会暴露错误,因此当a[i]
已经大于它之前的任何内容时,或者当它小于它之前的所有内容时,你可能会徘徊。在前一种情况下,您的内部循环会立即突破j==i-1
,temp
会被放回a[j+1]
a[i]
,这是j==-1
,但没有效果,但是正确无误;在后一种情况下,你的内部循环运行完成,离开a[0]=temp
并且你正在分配{{1}},这在这种情况下也是正确的。
答案 1 :(得分:0)
使代码更简洁,因此更好,更易理解
使用临时变量切换值:
for(j=i-1;j>=0;j--){
if(a[j]>temp){
t = a[j+1];
a[j+1] = a[j];
a[j] = t;
}
else
break;
}
更改后,行:a[j+1]=temp;//if i replace this by a[i] I am getting wrong output.
不需要。