2016-09-27 4 views
-1
int main(void) 
{ 
    int a[5] = {36,24,10,6,12}; 
    int pass; 
    int i;  
    int hold; 

    /* bubble sort */ 
    /* loop to control number of passes */ 

    for(pass=1; pass<5; pass++){ 
     /* loop to control number of comparisons per pass */ 
     for(i=0; i<5; i++){ 
      if(a[i] > a[i+1]){ 
       hold = a[i]; 
       a[i] = a[i+1]; 
       a[i+1] = hold; 
      } 
     } 
    } 

    return 0; 
} 

このバブルソートプログラムでは、隣接する要素の値を比較するif文があります。 カウンターIが4になると、[4]> a [4 + 1]の場合のステートメントは、配列に[5]要素がないので、プログラムがどのように比較し作業しているのでしょうか?バブルソートCの間違ったコード! [Deitel C 6th Ed]

私は理解できません(パス= 1;パス< 5;パス++)。このループは何のために働くのですか?なぜループが1から始まり、5ではなく4回連続するのですか。

誰もこのバブルソートプログラムがどのように機能しているかを実証してください。乾杯!

+3

コードが間違っていて、配列の外側にアクセスしています。 – Barmar

+3

あなたが持っているコードは*動作しません。それは配列が範囲外にインデックスを付けるので、*未定義の動作*を持っています。 –

+0

私はdeitelの本から見つけました!どのように間違っていることができますか? C Dietelによってプログラムする方法第6版 – Sairat

答えて

0

まあ、誰もコメントでこれを答えたが、誰も実際の答えを書く時間がなかったので、私はその役割を果たすだろう。

第一のものは、まず、あなたが貼り付けられたコードは、それにバグがあります。
配列int a[5]
i=4与えられた内部ループfor(i=0; i<5; i++)を実行し、
a[i+1]がアクセスしている5員[0..4]を、持っていながら、 a[5]は配列の範囲外であり、その値はおそらく予期しないものです。
価値あり:例値int a[5] = {36,24,10,6,12};が非常に小さいため、a[5]がオーバーライドまたは移動されないため、コードはとにかく動作する可能性が高い(36/2^32)。

しかし、値を変更しようとすると、int a[5] = {36,0xFFFFFFFF,10,6,12};と言うと、プログラムは必ず失敗するでしょう。あなたの他の質問への第二

:各反復(合格)との
は、その場所に4を配置した後、それは場所だと、最大値がバブリングされるため、5つの数字のため
...場所になります最後のものは暗黙的に与えられます。
だから、5回目の反復は必要ありません。

また、2番目から最後までの繰り返しでは、内部ループから最後の要素を除外することが一般的です。

int main(void) 
{ 
    int a[5] = {36,24,10,6,12}; 
    int pass; 
    int i;  
    int hold; 

    /* bubble sort */ 
    /* loop to control number of passes */ 

    for(pass=4; pass > 0; pass--){ /* pass counts down 4 iterations */ 
    /* loop to control number of comparisons per pass */ 
    /* 0..4, then 0..3 > 0..2, and lastly 0..1 */ 
    for(i=0; i<pass; i++){ 
     if(a[i] > a[i+1]){ 
     hold = a[i]; 
     a[i] = a[i+1]; 
     a[i+1] = hold; 
     } 
    } 
    } 
    return 0; 
} 
関連する問題