输出显示不同
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]
即可解决问题。
#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]
即可解决问题。