SSブログ

バブルソート(泡立ち法) [数値解析]

バブルソート(泡立ち法)

 

いま仮に次のような数の列があるとする。

  

これを小さい数から大きい数へならぶ順(昇順)の数の列に変えたいとする。

この最もシンプルな方法は、隣り合う要素の大小関係を比較し、大小が逆転していたら、隣り合う2つの要素を交換するという方法。

具体的には、まず、{3,2,1}の(3,2)を比較する。3と2の大小関係が逆転しているので、3と2を交換し(2,3)にする。すると、

  

になる。

次に、{2,3,1}の(3,1)の大小関係を比較すると、順序が逆転しているので、3と1を交換し、(1,3)にする。

すると、

  

になる。

これで、最も大きい3を右端に並べられことができた。

 

ということで、{2,1,3}の部分列、部分集合

  

の要素を昇順に並べ替えればいいだろう。

(2,1)を比較すると、これは順序が逆転しているので順序を交換し、(1,2)にすると、

  

になる。

以上のことをまとめると、

  

と、隣り合う要素の大小関係を比較し、順序が逆転していたら両者を交換することによって、{3,,1}を昇順に{1,,3}にできる。

こういう数の列の並び替えをバブルソート(泡立ち法)という。

 

では、もっと複雑な

  

の場合について考える。

(4,2)は順序が逆転しているので、2つの要素を交換すると、

  

になる。

次に、(4,5)を比較すると、この順序は逆転していないので、交換せずにそのまま。

  

次に、(5,1)を比較すると、順序が逆転しているので、交換する。

  

次に、(5,3)を比較すると、順序が逆転しているので、2つの要素を交換する。

  

これで最も大きな5が右端に並べられた。

というわけで、今度は、

  

を同様に昇順に並べ替えればよい。

  {2,4,1,3}→{2,4,1,3}→{2,1,4,3}→{2,1,3,4}

これで、最大の4を右端に持ってくることができたので、4を取り除いた部分集合

  {2,1,3}

を同様に並び替えると、

  {2,1,3}→{1,2,3}→{1,2,3}

になる。

これですべて昇順に並び替えることができたのだけれど、{1,2,3}の最大値3を取り除いた部分集合

  {1,2}

を昇順に並び替える。

  {1,2}→{1,2}

これで並び替えの作業はおしまい。

これで、{2,4,5,1,3}を昇順に{1,2,3,4,5}と並び替えることができた。

 

さらに一般的につぎのような数の列、集合があるとする。

  

これを昇順に並び替える方法、アルゴリズムは次のようなものになるだろう。

 

do i=nn−1,n−2、・・・,2

 do j=1,2,・・・,i−1

  a(j)a(j+1)の大小を比較してa(j)a(j+1)を交換

 end do j

end do i

 

フォートラン的な記述ですが・・・。

 

これを元にFortranのプログラムを作ると、次のようになる。

 

! バブルソート
parameter(n=5)
integer a(n)
integer dummy

a(1)=4; a(2)=2; a(3) = 5; a(4)=1; a(5)=3

do i=n, 2, -1
    do j=1,i-1
        if (a(j).gt.a(j+1)) then !順序が逆転していたら交換
            dummy = a(j)
            a(j)=a(j+1)
            a(j+1)=dummy
        end if
    end do
end do

write(*,*) a

end

 

バブルソートを用いると、昇順にデータを並び替えられるのですが、この方法は、データの比較・交換の回数が最悪、

  

n²/2回。

n=100ならば最悪5000回、n=1000ならば50万回、n=1万ならば5千万回と、データの数nが大きくなると、データの比較・交換回数が大きくなりすぎるので、実際の並び替え、ソーティングでバブルソートが使われることはない。

 

まぁ、パソコンといえども、現在は処理速度、計算速度がトンデモなく速いから、データ数が1万くらいあってもバブルソートですぐに並び終えるので、データ数が1万くらいまでならば、最も基本的なバブルソートで十分に実用に足りると思うけれど、コンピュータの能力が低かったときは、バブルソートの遅さは致命的だったんだケロよ。

 

次回は、バブルソートよりも少しだけ早くソーティングが可能になる方法を紹介するにゃ。

 

 


nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。