#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。
我努力尝试但是在这里找不到错误如果答案是如此简单或者我编写代码时我的错误没有downvote问题告诉我什么是错的它可能是我的最后一个问题堆栈溢出将阻止在此之后我。
答案 0 :(得分:1)
错误在[i + i] = a [i]行上。它应该是[i + 1]。当你有i + i(和i&gt; = 3)时,它会尝试访问索引你不知道发生了什么,因为它不是空间。
答案 1 :(得分:1)
您的计划中存在拼写错误。
而不是
a[i+i]=a[i];
应该有
a[i+1]=a[i];
考虑到根据C标准,没有参数的函数main应声明为
int main( void )
在整个计划中使用“原始数字”也是一个坏主意。
最好将排序放入单独的函数中。
相应的程序可能看起来像
#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
对于大型数组,最好使用二进制搜索而不是顺序比较。
答案 2 :(得分:0)
此处您的数组大小为6。当你声明A [6]时。现在考虑i = 4的情况,所以在这一行a[i+i]=a[i];
中
您正尝试访问a[4+4]=a[4]
。您无法访问索引a [8]。只需将[i + i]更改为[i + 1]即可解决问题。