2017-10-14 136 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]即可解決問題。