f11...

3
202 バブルソート F 「隣と比べて並べたい順序と違っていたら入れ替える」を繰り返すのがバブルソート 選択ソート,挿入ソートに加えて,もうひとつ整列アルゴリズムを説明します。別 単純交換法とも呼ばれる,バブルソート(bubble sortです。 バブルソートのアルゴリズム F11 ここでも, { 31, 41, 59, 26, 53, 58, 97, 93, 23, 84 } のような値を持つ a[] を昇順に並べる場合で考えてみましょう。 バブルソートと同じ手順で人間が並び替えをすることは,まずないでしょう。です からここでは,アルゴリズムの発想とその動きを, 1 から説明していくことにします。 さて,前記の配列は,一見すれば整列されていないことがわかります。では,「整列 されていない」のはどんな点からわかるでしょうか。昇順に整列されているならば, 後ろの要素は前の要素以上の値を持ってい なければなりません。前記の配列では,「59 26」「97 93」「93 23」といった箇所が,そ うなっていません。ですから,こういった 「順序が逆」である箇所を直しまくれば 4 4 4 4 4 4 ,つ いには整列されると考えるのです。 バブルソートの発想の最大のポイント は, 隣と比べて並べたい順序と違っていたら 入れ替えることです。 バブルソートの手順 (1) バブルソートの手順を見ていきましょう。 a[0] 31)と a[1]41)を比較しま す。昇順なので交換しません。 a[1] 41)と a[2]59)を比較しま す。昇順なので交換しません。 a[2] 59)と a[3]26)を比較しま す。降順なので交換しますa[3] 59)と a[4]53)を比較しま す。降順なので交換します…… これがバブルソートの「1 セット」です。し 31 41 59 26 53 58 97 93 23 84 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 31 41 59 26 53 58 97 93 23 84 31 41 59 26 53 58 97 93 23 84 × × 31 41 59 26 53 58 97 93 23 84 31 41 59 26 53 58 97 93 23 84 31 41 59 26 53 58 97 93 23 84 31 41 59 26 53 58 97 93 23 84 × × × × 31 41 59 26 53 58 97 93 23 84 31 41 59 26 53 58 97 93 23 84 31 41 59 26 53 58 97 93 23 84 × × × × × × 1J-C.indd 202 2009/02/24 23:59:50

Upload: others

Post on 28-Jun-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: F11 バブルソートのアルゴリズムct13525/JProg/BubbleSort.pdf名単純交換法とも呼ばれる,バブルソート(bubble sort)です。F11 バブルソートのアルゴリズム

202

バブルソートF 「隣と比べて並べたい順序と違っていたら入れ替える」を繰り返すのがバブルソート•

選択ソート,挿入ソートに加えて,もうひとつ整列アルゴリズムを説明します。別

名単純交換法とも呼ばれる,バブルソート(bubble sort)です。

バブルソートのアルゴリズムF11 ここでも,

{ 31, 41, 59, 26, 53, 58, 97, 93, 23, 84 }のような値を持つ a[]を昇順に並べる場合で考えてみましょう。

バブルソートと同じ手順で人間が並び替えをすることは,まずないでしょう。です

からここでは,アルゴリズムの発想とその動きを,1から説明していくことにします。さて,前記の配列は,一見すれば整列されていないことがわかります。では,「整列

されていない」のはどんな点からわかるでしょうか。昇順に整列されているならば,

後ろの要素は前の要素以上の値を持ってい

なければなりません。前記の配列では,「59・26」「97・93」「93・23」といった箇所が,そうなっていません。ですから,こういった

「順序が逆」である箇所を直しまくれば4 4 4 4 4 4

,つ

いには整列されると考えるのです。

バブルソートの発想の最大のポイント

は,隣と比べて並べたい順序と違っていたら

入れ替えることです。

バブルソートの手順 (1)バブルソートの手順を見ていきましょう。

a[0]• (31)と a[1](41)を比較します。昇順なので交換しません。

a[1]• (41)と a[2](59)を比較します。昇順なので交換しません。

a[2]• (59)と a[3](26)を比較します。降順なので交換します。

a[3]• (59)と a[4](53)を比較します。降順なので交換します。

……• これがバブルソートの「1セット」です。し

31 41 59 26 53 58 97 93 23 84

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

a[9]

31 41 59 26 53 58 97 93 23 84

31 41 59 26 53 58 97 93 23 84

○○

○○

○○

××

31 41 5926 53 58 97 93 23 84

31 41 5926 53 58 97 93 23 84

31 41 5926 53 58 97 93 23 84

31 41 5926 53 58 97 93 23 84

××

××

31 41 5926 53 58 9793 23 84

31 41 5926 53 58 9793 23 84

31 41 5926 53 58 9793 23 84

××

××

××

1J-C.indd 202 2009/02/24 23:59:50

Page 2: F11 バブルソートのアルゴリズムct13525/JProg/BubbleSort.pdf名単純交換法とも呼ばれる,バブルソート(bubble sort)です。F11 バブルソートのアルゴリズム

203

情報処理[電子情報工学科・1年]

かしこれだけでは,整列されていません。何セットか繰り返して,順序が逆になって

いる部分をどんどん直していけば,ついには整列されるのです。

この部分だけを,配列の要素数 Nとして C言語のコードとして記述すると,for (j = 0; j < N - 1; j++) {

if (a[j] > a[j + 1]) {

a[j]と a[j + 1]の値を交換

}

}

となります。

バブルソートの手順 (2)一方で注目すべきなのは,a[0]~a[9]の最大値「97」が,1セット終了後に a[9]

に移動していることです。最大値「97」が a[]のどこにあっても,1セット終了後に確実に a[9]に移動します *1。ということは,次のセットは a[0]~a[9]について行

う必要はなくて,a[0]~a[8]について行えばよいということになります。同様に考

えていけば,

0セットめは,• a[0]~a[9]について行

う;a[9]にその最大値が現れる

1セットめは,• a[0]~a[8]について行

う;a[8]にその最大値が現れる

……• 8セットめは,• a[0]~a[1]について行

う;a[1]にその最大値が現れ,整列完

となり,繰り返すセット数はデータ数より 1少ない回数です *2。それで,iセットめの整列

対象は,a[0]~a[N - i]です。

1セットごとの a[]の値の様子を,右図

に示します。グレーで示した部分が,それぞ

れのセットの終了時に最大値が現れ,確定す

る要素です。

以上を考え合わせると,バブルソートの核

心部分は,次のようにコーディングできま

す。

*1 「バブルソート」の名は,整列対象範囲の最大値(または最小値)が,範囲の端に泡が浮き上がるように現れることから付けられたものです。*2 コーディングしやすいように,セット数を 0から数えています。

31 41 59 26 53 58 97 93 23 84

31 41 5926 53 58 9793 23 84

31 41 5926 53 58 979323 84

31 41 5926 53 58 979323 84

31 41 5926 53 58 979323 84

31 41 5926 53 58 979323 84

31 41 5926 53 58 979323 84

31 41 5926 53 58 979323 84

31 41 5926 53 58 979323 84

31 41 5926 53 58 979323 84

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

a[8]

a[9]

1J-C.indd 203 2009/02/24 23:59:50

Page 3: F11 バブルソートのアルゴリズムct13525/JProg/BubbleSort.pdf名単純交換法とも呼ばれる,バブルソート(bubble sort)です。F11 バブルソートのアルゴリズム

204

for (i = 0; i < N - 1; i++) {

for (j = 0; j < N - 1 - i; j++) {

if (a[j] > a[j + 1]) {

a[j]と a[j + 1]の値を交換

}

}

}

バブルソートのプログラムF11 前項のコード片を組み込んだプログラムを,前節と同様に示しておきましょう。

バブルソートのプログラムプログラム 50:#include <stdio.h>11

21

#define N 1031

41

int main() {51

int a[N] = { 31, 41, 59, 26, 53, 58, 97, 93, 23, 84 };61

int i, j, t;71

81

/* 整列前の a[]の内容を出力 */91

printf("整列前:");111

111 あ

/* バブルソート */121

for (i = 0; i < N - 1; i++) {131

for (j = 0; j < N - 1 - i; j++) {141

if (a[j] > a[j + 1]) {151

161 い

}171

}181

}191

/* 整列後の a[]の内容を出力 */211

printf("整列後:");211

221 う

return 0;231

}241

1J-C.indd 204 2009/02/24 23:59:50