C++ 插入排序错误 intmain(){ int i,j,温度; int a[]={3,2,4,7,1}; 对于(i=1;i=0;j--){ 如果(a[j]>温度) a[j+1]=a[j]; 其他的 打破 } a[j+1]=temp;//如果我用[I]替换它,我将得到错误的输出。 } for(i=0;i
使代码更简洁,因此更好理解C++ 插入排序错误 intmain(){ int i,j,温度; int a[]={3,2,4,7,1}; 对于(i=1;i=0;j--){ 如果(a[j]>温度) a[j+1]=a[j]; 其他的 打破 } a[j+1]=temp;//如果我用[I]替换它,我将得到错误的输出。 } for(i=0;i,c++,c,data-structures,C++,C,Data Structures,使代码更简洁,因此更好理解 使用临时变量切换值: 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 bre
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;
}
a[j+1]=temp;//如果我用[i]替换它,我将得到错误的输出。
不需要在我看来,您的程序看起来是正确的,但注释表明您不理解其意图。内部循环将过去在索引处的元素严格地在
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
,在这种情况下也是正确的。请格式化代码。数组的第一项的索引为zero@EdHeal循环从1开始并不意味着它使用了错误的索引…特别是在排序算法中。注意j=i-1
…从0开始i
是错误的(和UB)。“我没有改变变量I的值”--但你正在改变a[I]
(在第一次迭代时,j+1
==I
)因此,如果你存储的是错误的结果,而不是它的原始值,那么你当然会得到错误的结果。+1是一个正确而彻底的答案,可以准确地指出OP的困惑,并与其他人提供的一些垃圾(包括关闭投票)形成对比。“在这些更改之后。”“--一个完美的插入排序会因为不必要的交换而降级。”“为了使代码更简洁,从而更好、更容易理解”--多么荒谬;您的更改没有做任何类似的事情。而且您没有回答OP的问题…这就是为什么a[j+1]=temp
有效,而a[j+1]=a[i]
无效的原因。
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;
}