插入排序错误

时间:2014-10-04 08:52:49

标签: 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
                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],我输错了。我错过了一些重要的概念吗?

2 个答案:

答案 0 :(得分:5)

你的程序对我来说是正确的,但评论显示你并不理解这个意图。内循环将以前在索引之间的元素严格地移动到j(最终值)和i之间的一个位置,从而破坏a[i]的旧值。该值已在temp中留出,因此应将temp而不是a[i]分配给已释放的广告位a[j+1],这是该计划的作用。

由于极端情况有时会暴露错误,因此当a[i]已经大于它之前的任何内容时,或者当它小于它之前的所有内容时,你可能会徘徊。在前一种情况下,您的内部循环会立即突破j==i-1temp会被放回a[j+1] a[i],这是j==-1,但没有效果,但是正确无误;在后一种情况下,你的内部循环运行完成,离开a[0]=temp并且你正在分配{{1}},这在这种情况下也是正确的。

答案 1 :(得分:0)

使代码更简洁,因此更好,更易理解

  1. 使用临时变量切换值:

        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;
        }
    
  2. 更改后,行:a[j+1]=temp;//if i replace this by a[i] I am getting wrong output.不需要。