输出显示不同

Output is showing different

#include<stdio.h>
int main()
{   
int a[6]={2,5,4,6,1,3};
int j,key,i,k;   
for(j=1;j<6;++j)
{
    key=a[j];
    i=j-1;
    while((i>=0)&&(a[i]>key))
    {
        a[i+i]=a[i];
        i=i-1;
    }
    a[i+1]=key;
}

for(i=0;i<6;i++)
printf("%d\n",a[i]);
}

当我自己计算时得到 1,2,3,4,5,6 但输出是 2,4,5,6,1,3。

我试了好久,还是找不到问题所在。

错误在 a[i+i]=a[i] line.It 应该是 a[i+1]。当你有 i+i(并且 i>=3)时,它会尝试访问您不知道发生了什么的索引,因为它不是 space.

您的程序中有错字。

而不是

a[i+i]=a[i];

会有

a[i+1]=a[i];

考虑到根据 C 标准,不带参数的函数 main 应声明为

int main( void )

在整个程序中使用 "raw numbers" 也是一个坏主意。

最好将排序放在一个单独的函数中。

对应的程序可以是这样的

#include <stdio.h>

void insertion_sort(int *a, size_t n)
{
    for (size_t i = 1; i < n; i++)
    {
        size_t j = i;
        int value = a[i];

        for (; j != 0 && value < a[j - 1]; --j)
        {
            a[j] = a[j - 1];
        }

        if (j != i) a[j] = value;
    }
}

int main( void )
{
    int a[] = { 2, 5, 4, 6, 1, 3 };
    const size_t N = sizeof(a) / sizeof(*a);

    for (size_t i = 0; i < N; i++)
    {
        printf("%2d ", a[i]);
    }
    putchar('\n');

    insertion_sort(a, N);

    for (size_t i = 0; i < N; i++)
    {
        printf("%2d ", a[i]);
    }
    putchar('\n');

    return 0;
}

它的输出是

2  5  4  6  1  3
1  2  3  4  5  6

对于大数组,最好使用二进制搜索而不是顺序比较。

这里你的数组大小是 6,因为你声明了 A[6]。现在考虑 i=4 的情况,所以在这一行 a[i+i]=a[i] 中你试图访问 a[4+4]=a[4].

您无法访问索引 a[8]。只需将 a[i+i] 更改为 a[i+1] 即可解决问题。