2017-10-14 95 views
-2
#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。输出显示不同

我试了很难,但在这个请求中找不到错误,如果答案很简单,或者是我在编写代码时出错,请不要低估这个问题告诉我这是什么问题,可能是我最后一个问题堆栈溢出会在此之后阻止我。

+1

'a [i + i]'访问数组越界并调用*未定义的行为*(同时''while循环的整个逻辑看起来很奇怪 - 它应该完成什么?) – UnholySheep

+2

另请参见:不要低估你的问题通常会产生相反的效果。而你还没有表现出你的调试工作要么 – UnholySheep

+0

我不是说不要downvote请告诉我的原因吧(我知道人做连我自己),请解释一下这个访问数组越界详细 – Charan2628

回答

1

您的程序中存在拼写错误。

而不是

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

必有

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

考虑到,根据C标准不带参数的功能主要应声明如下

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 

对于大阵列,最好是使用二进制搜索,而不是连续的比较。

+0

@ Charan2628没问题。:) –

1

的错误是在[I + 1] = A [1] line.It应该是第[i + 1]。当你已我+ I(我> = 3)尝试访问该索引你不知道发生了什么,因为这不是空间。

0

这里你的数组大小是6。当你声明的[6]。现在考虑的情况下,我= 4,所以在这条线上a[i+i]=a[i];
您试图访问a[4+4]=a[4]。你不能访问索引a [8]。只需将[i + i]更改为[i + 1]即可解决问题。