2011-12-19 8 views
2

バブルソートを実装しようとしています。私は、doループの内部にforループを使用する次のコードを書いています。これを2つのループを使用するバブルソートにするにはどうすればよいですか?このバブルソートを別の方法で実装するにはどうすればよいですか?

ここに私のコードです:

do { 
    switched = false; 
    for (int i = 1; i < size; i++) { 
     if (a[i] < a[i-1]) { 
      int temp = a[i]; 
      a[i] = a[i-1]; 
      a[i-1] = temp; 
      switched = true; 
     } 
    } 
} while (switched); 

(これは宿題をタグ付けされたが、これは最終試験ではなく、実際の宿題のために勉強している)

+5

「バブルソートを実装しようとしています」 - 問題があります。 (真剣に、なぜ彼らはBubblesortの使用を教えることを主張し続けているのですか?) –

+1

@MitchWheat、ソルトソートを実装することはちょうど出発指導者にすぎません。 –

+2

ゼロから始めるべきではないですか? –

答えて

6

リストの最後の要素が常にソートされていることがわかっているので(上から泡立っているので)、そこで停止することができます。

for(int x = size; x >= 0; x--) { 
    bool switched = false; 
    for(int i = 1; i < x; i++) { 
     if(blah) { 
      // swap code here 
      switched = true; 
     } 

    } 
    if(!switched) break; // not the biggest fan of this but it gets the job done 
} 
+1

これはあなたのプロが探している答えです。 –

+0

'break 'が気に入らなければ、条件付きで' i

+0

@ジョン前にCS101の宿題を採点しています。これは、教授が最もよく探しているもの、特に最近の最高の要素がどのようにソートされているかに関する小さなスニペットです。 – corsiKa

5

ビット絶対、ちょっと、あなたはそれを求め:

ループの
for(bool switched=true; switched;) 
{ 
    switched = false; 
    for (int i = 1; i < size; i++) { 
     if (a[i] < a[i-1]) { 
      int temp = a[i]; 
      a[i] = a[i-1]; 
      a[i-1] = temp; 
      switched = true; 
     } 
    } 
} 

つ...

+2

私はupvoteしたくない...うわーそれは悪いです!それと同時に、私はdownvoteを望んでいません。なぜなら、それは1)巧みで、2)正しいことです。引き裂かれた! – corsiKa

+2

あなたは 'for'ステートメントの残酷な扱いについて報告されるべきです! –

+1

@glowcoder:自由に投票してください。コメントをいただければ幸いです!私はこの素敵な答えと冗談コメントの間で引き裂かれました:) – sehe

0

あなたは内側のループを実行することができますをチェックする代わりに、外側ループfor(int j=0; j<size; ++j)をチェックする代わりに回。それを少し悪く非効率的にするために、毎回内部ループを1ステップ短くすることができます。

0

ループの最初のフルパス(つまり、ループの最初の反復であるdo)は、最大要素を位置a[size - 1]に配置することが保証されています。 (理由は分かりますか?)次のフルパスは、の2番目に大きい要素を位置a[size - 2]に置くことが保証されています。 (やはり、あなたはなぜそれを見ますか?)などです。だから、最初のパスは1からsize - 1に行くためにiを必要としますが、2番目は唯一の3分の1が唯一のように1からsize - 3に行くためにiを必要とし、1からsize - 2に行くためにiを必要とします。全体として、最大でsize - 1のパスが必要です(最後のパスは位置をカバーし、a[1]a[0]を比較すると最小の要素が適切に配置されていることを確認してください)。

ので、max_i1からiを変化させるために必要-loop当初size - 1に設定し、1で終わる、max_iを変更する必要があり、あなたの内側のfor -loopあなたの外側for

0

doループが実行できる最大回数について考えてみよう。

3

内部ループが実行される最大回数はsize回であるため、外側ループのみをsizeでバインドすることができます。次のようにループのための2つを使用する

for (int x = 0; x < size; x++) 
{ 
    switched = false; 
    for (int i = 1; i < size; i++) 
    { 
     if (a[i] < a[i - 1]) 
     { 
      int temp = a[i]; 
      a[i] = a[i - 1]; 
      a[i - 1] = temp; 
      switched = true; 
     } 
    } 

    if(switched) 
    { 
     break; 
    } 
} 
0

A本当に愚かな方法は次のようになります。

for(bool switched=true;switched;) 
{ 
    switched=false; 
    for(int i=1; i<size; ++i) 
    { 
     if (a[i] < a[i-1]) 
     { 
      int temp = a[i]; 
      a[i] = a[i-1]; 
      a[i-1] = temp; 
      switched = true; 
     } 
    } 
} 

より深刻な答えは以下の通りであるかもしれません...

for(int i=0; i<(size-1); ++i) 
{ 
    for(int j=(i+1); j<(size-1); ++j) 
    { 
     if(a[i]>a[j]) 
     { 
      temp=a[i]; 
      a[i]=a[j]; 
      a[j]=temp; 
     } 
    } 
} 
1

バブルソートへの単純な改善がスワップが発生した最後場所を覚えておくことですが、今、私はそれについて考える、これはおそらく、バブルソートではありません。各パスの後、その点を超える要素がソートされます。次回ループを通過すると、前の最高水準点まで反復されます。

void bubble_sort(int *arr, int size) 
{ 
    for (int hwm; size > 1; size = hwm) 
    { 
     hwm = 0; 
     for (int i = 1; i < size; ++i) 
     { 
      if (arr[i] < arr[i-1]) 
      { 
       std::swap(arr[i], arr[i-1]); 
       hwm = i; 
      } 
     } 
    } 
} 
関連する問題