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;
        }