2016-12-01 9 views
1

1、2、3、4、5と入力します。出力はすでに低から高にソートされているので、問題はありません。しかし、私はそれが出力しています5、4、3、2、1を入力すると:バブルソート:なぜ正しく動作しないのですか?

4、3、2、1、5

を私は道でバブルソートを行うにしようとしています。

main() { 
     int a[5], i, smallest, temp; 
     cout << "Enter 5 numbers: " << endl; 
     for (i = 0; i <= 4; i++) { 
      cin >> a[i]; 
     } 

     for (i = 0; i <= 4; i++) { 
      smallest = a[i]; 
      if (smallest > a[i+1]) { 
       temp = a[i]; 
       a[i] = a[i+1]; 
       a[i+1] = temp; 
      } 
     } 
     cout << endl << endl; 

     for (i = 0; i <= 4; i++) { 
      cout << a[i] << endl; 
     } 
     system("pause"); 
    } 

私はあなたの役に立つ回答した後、これに私のコードを変更しました:

for (i = 0; i <=4; i++) { 
    smallest = a[i]; 
    for (j = 1; j <= 4; j++) { 
     if (smallest > a[j]) { 
      temp = a[i]; 
      a[i] = a[j]; 
      a[j] = temp; 
     } 
    } 
} 

それは働いていない理由を私は知りません。私はプログラミングでnoobですので、本当に申し訳ありませんので、私はちょうど出発しています。私はちょうど出発しています:)

助けが高く評価されます。 。

おかげで^^

+4

デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+1

あなたは1回の反復を完了するだけなので –

+0

あなたのアルゴリズムを[Wikipediaの定義](https://en.wikipedia.org/wiki/Bubble_sort)に追加してください。ループがありません。 – starturtle

答えて

6

シングルパスはあなたが何もスワップが行われなくなるまで何度も繰り返し配列をスキャンする必要があり、十分ではありません。

bool sorted = false; 

while (!sorted) { 
    sorted = true; 

    for (i = 0; i <= 4 - 1; i++) { /* notice 4 - 1 since we address a[i + 1] */ 
     smallest = a[i]; 

     if (smallest > a[i+1]) { 
      temp = a[i]; 
      a[i] = a[i+1]; 
      a[i+1] = temp; 

      sorted = false; 
     } 
    } 
} 
+0

@Dave:ああ!私は、ありがとう!確かに、 '4 - 1'でなければなりません –

+2

' i <= 4 - 1'ではなく 'i <4'や' i NathanOliver

+0

@ NathanOliver:質問に*エラー* 'i <= 4'が含まれています。 '4 - 1'を置いたとき、私はそれを簡単な方法で修正したいと思っていました:' a [i] '、' a [i + 1] 'の' i <= 4-1 ' 'a [i + 2] 'の場合は' i <= 4-2 'などとする。 –

1

すべてのアルゴリズムは、最大を移動することですないので配列の末尾に番号を付けます。 bubble sortは時間の複雑さがO(n²)であるため、2つのネストされたサイクルを使用する必要があります。配列がソートされるまで、書き込んだサイクルを繰り返すことができます。これはあまり効率的ではありませんが、うまくいくはずです。

また、配列の範囲外のインデックスにアクセスしないようにチェックする必要があります。

関連する問題