Skip to main content

3つの基本的なソートアルゴリズム

3つのソートを手でやってみよう

今日やること

これから、同じ6個の数字を使って、

  • バブルソート
  • 選択ソート
  • 挿入ソート

の3種類の並べ替えを、プログラムを書かずに自分の手で実行します。

最初の数字は、すべて同じです。

6  2  5  1  4  3

目標は、小さい順に

1  2  3  4  5  6

と並べることです。

この課題では、まだプログラムの変数や繰り返し処理は使いません。

まずは、

「数字を並べ替えるとき、実際にどんな作業を繰り返しているのか」

を自分の手で確かめてみましょう。


1.バブルソートを手でやってみよう

1-1.バブルソートのルール

バブルソートでは、隣り合った2つの数字を比較します。

左の数字の方が大きければ、その2つを交換します。

そして、比較する場所を1つ右へ動かします。

これを左から右まで繰り返します。


1-2.まず、やり方を見てみよう

次の数字を使って、1周だけやってみます。

4  1  3  2

最初の2つを比較します。

[4  1] 3  2    swap(4, 1)
1  4  3  2

次の隣り合った2つを比較します。

1 [4  3] 2    swap(4, 3)
1  3  4  2

さらに次へ進みます。

1  3 [4  2]    swap(4, 2)
1  3  2  4

これで1周終了です。

一番大きい 4 が、一番右まで移動しました。


1-3.同じようにやってみよう

では、次の6個の数字を同じ方法で並べ替えます。

開始:

6  2  5  1  4  3

1周目

左から順番に、隣り合った2つを比較していきます。

必要なら交換し、交換したときは swap(○, ○) も書きましょう。

開始
6  2  5  1  4  3

↓

________________________________________

↓

________________________________________

↓

________________________________________

↓

________________________________________

↓

________________________________________

1周目が終わった状態:

________________________

一番右に来た数字は何ですか?

________

その数字は、もう動かす必要がありそうですか?

ある ・ ない

1-4.2周目

1周目で位置が決まった一番右の数字は、もう比較しません。

同じように、残った部分を左から右へ調べます。

開始
________________________

↓

________________________________________

↓

________________________________________

↓

________________________________________

↓

________________________________________

2周目が終わった状態:

________________________

1-5.3周目

開始
________________________

↓

________________________________________

↓

________________________________________

↓

________________________________________

3周目が終わった状態:

________________________

1-6.4周目

開始
________________________

↓

________________________________________

↓

________________________________________

4周目が終わった状態:

________________________

1-7.5周目

開始
________________________

↓

________________________________________

5周目が終わった状態:

________________________

1-8.バブルソートをやって気付いたこと

バブルソートでは、どんな2つの数字を比べていましたか?

________________________________________

1周するたびに、どちら側から数字の位置が決まっていきましたか?

左側 ・ 右側

1周目と2周目では、比較する回数は同じでしたか?

同じ ・ 違う

なぜそうなったと思いますか?

________________________________________

________________________________________

2.選択ソートを手でやってみよう

最初の状態に戻します。

6  2  5  1  4  3

2-1.選択ソートのルール

選択ソートでは、

まだ並べ終わっていない部分から、一番小さい数字を探す

という作業をします。

一番小さい数字を見つけたら、まだ並べ終わっていない部分の一番左の数字と交換します。


2-2.まず、やり方を見てみよう

次の数字でやってみます。

4  2  3  1

まだ全部が未確定なので、まず全体から一番小さい数字を探します。

一番小さい数字は 1 です。

未確定部分の一番左にある 4 と交換します。

[4] 2  3 [1]    swap(4, 1)
1  2  3  4

これで、一番左の 1 の位置が決まりました。

1 | 2  3  4

次は、残った

2  3  4

の中から一番小さい数字を探します。

一番小さい数字はすでに左端の 2 なので、交換する必要はありません。

1 | 2  3  4    交換なし

このように、

一番小さい数字を探す → 未確定部分の左端と交換する

を繰り返します。


2-3.同じようにやってみよう

次の6個の数字を、同じ方法で最後まで並べ替えましょう。

開始:

6  2  5  1  4  3

1回目

未確定部分から一番小さい数字を探し、左端と交換します。

________________________________________
________________________________________

1回目が終わった状態:

________________________

2回目

すでに確定した左側は調べません。

________________________________________
________________________________________

2回目が終わった状態:

________________________

3回目

________________________________________
________________________________________

3回目が終わった状態:

________________________

4回目

________________________________________
________________________________________

4回目が終わった状態:

________________________

5回目

________________________________________
________________________________________

5回目が終わった状態:

________________________

2-4.選択ソートをやって気付いたこと

1回の処理で、まず何を探していましたか?

________________________________________

見つけた数字は、どの数字と交換していましたか?

________________________________________

どちら側から数字の位置が決まっていきましたか?

左側 ・ 右側

3.挿入ソートを手でやってみよう

もう一度、最初の状態に戻します。

6  2  5  1  4  3

3-1.挿入ソートのルール

挿入ソートでは、左側を

すでに小さい順に並んでいる部分

として考えます。

最初は数字が1個だけなので、

6 | 2  5  1  4  3

左側の 6 だけなら、すでに並んでいます。

次に、その右隣の数字を左側の並んでいる部分へ入れていきます。

左隣の数字と比べて、左隣の方が大きければ交換します。

そして、さらに左隣と比べます。

正しい位置に来るまで、この交換を繰り返します。


3-2.まず、やり方を見てみよう

次の数字でやってみます。

4 | 3  1  2

まず 3 を左側の並んでいる部分へ入れます。

左隣の 4 の方が大きいので交換します。

[4  3] 1  2    swap(4, 3)
3  4 | 1  2

次は 1 を入れます。

まず左隣の 4 と交換します。

3 [4  1] 2    swap(4, 1)
3  1  4  2

まだ左隣の 3 の方が大きいので、もう一度交換します。

[3  1] 4  2    swap(3, 1)
1  3  4 | 2

このように、

左隣と比べる → 左隣の方が大きければ交換する

を繰り返すことで、数字を正しい位置へ入れていきます。


3-3.同じようにやってみよう

次の6個の数字を、同じ方法で最後まで並べ替えましょう。

開始:

6 | 2  5  1  4  3

1回目

________________________________________
________________________________________

1回目が終わった状態:

________________________

2回目

________________________________________
________________________________________

2回目が終わった状態:

________________________

3回目

必要なだけ左隣との交換を繰り返します。

________________________________________
________________________________________
________________________________________
________________________________________

3回目が終わった状態:

________________________

4回目

________________________________________
________________________________________
________________________________________

4回目が終わった状態:

________________________

5回目

________________________________________
________________________________________
________________________________________
________________________________________

5回目が終わった状態:

________________________

3-4.挿入ソートをやって気付いたこと

毎回、どちら側が小さい順に並んだ状態になっていましたか?

左側 ・ 右側

新しく入れる数字は、何と比較していましたか?

________________________________________

左隣の数字の方が大きいとき、何をしていましたか?

________________________________________

どこまで交換を繰り返していましたか?

________________________________________

4.3つのソートを比べてみよう

ここまで自分でやった結果を使って整理しましょう。

ソート 何を繰り返していた? どちら側から整っていく?
バブルソート ______________________________ ______
選択ソート ______________________________ ______
挿入ソート ______________________________ ______

5.自分の言葉でまとめよう

バブルソート

どんな並べ替え方でしたか?

________________________________________

________________________________________

選択ソート

どんな並べ替え方でしたか?

________________________________________

________________________________________

挿入ソート

どんな並べ替え方でしたか?

________________________________________

________________________________________

6.次に考えること

ここまでの課題では、数字を並べ替えるために、

  • 同じような比較
  • 同じような交換
  • 同じような探索
  • 同じような移動

を何度も繰り返しました。

次は、

この「何度も繰り返した作業」を、疑似言語ではどう書けばよいか

を考えていきます。