2017-10-14 14 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

:あなたの質問をd​​ownvoteしないことは、通常、反対の効果があります。あなたはデバッグ作業を表示していませんでした。 – UnholySheep

+0

私はdownvoteをしないと言っているわけではありません。理由を教えてください。(私もそうしています。)詳細についてはアレイをアクセスして説明してください。 – Charan2628

答えて

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 

です。

+0

@ Charan2628問題はありません。:) –

1

エラーは[i + i] = a [i]行にあります。i + i(およびi> = 3)の場合、インデックスにアクセスしようとすると[i +その上に何が起こっているのかわからないのは、それがスペースではないからです。

0

ここでは、配列のサイズは6です。あなたがA [6]と宣言したように、今度はi = 4の場合を考えてください。a[i+i]=a[i];
a[4+4]=a[4]にアクセスしようとしています。インデックスa [8]にはアクセスできません。 [i + i]をa [i + 1]に変更するだけで問題を解決できます。

関連する問題