c++ - 插入排序错误

标签 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],我会得到错误的输出。我是否遗漏了一些重要的概念?

最佳答案

你的程序对我来说看起来是正确的,但评论表明你不理解其意图。内部循环将严格位于 j(最终值)和 i 之间索引处的元素向上移动一位,从而破坏 a[ 的旧值我]。该值已在 temp 中保留,因此应将 temp 而不是 a[i] 分配给释放的槽 a [j+1],这就是程序的作用。

由于极端情况有时会暴露错误,因此您可能会想知道当 a[i] 已经大于它之前的任何内容,或者它小于它之前的所有内容时会发生什么。在前一种情况下,您的内部循环会立即因 j==i-1 中断,并将 temp 放回 a[j+1] > 是a[i],没有任何效果,但是是正确的;在后一种情况下,您的内部循环运行完成,留下 j==-1 并且您正在分配 a[0]=temp,这在这种情况下也是正确的。

关于c++ - 插入排序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26191231/

相关文章:

c++ - 用opengl画图SDL Renderer就没用了吗?

c++ - 为什么这个 C++ 显式模板特化代码是非法的?

将多字符数组复制到另一个多字符数组

c# - 使用 O(1) 内存、O(n) 运行时复杂度且无双重枚举实现 LINQ "chunk by predicate"

mongodb - MongoDB 中的子结构与扁平数据结构 - NoSQL

c++ - 特定成员的模板特化?

将 2 个字节的字符串(文本)表示形式转换为整数

C - 为什么 getopt 在 Linux 上返回 255?

c++ - 拓扑排序中的邻接表表示

c++ - Qt - 自定义小数点和千位分隔符