#pragma twice

KAB-studio > プログラミング > #pragma twice > 243 Version 13.07 最も簡単なソート

#pragma twice 243 Version 13.07 最も簡単なソート

前のページへ 表紙・目次へ 次のページへ

 Version 13.07
最も簡単なソート

今回はまず、一番簡単で基本的なソートについて紹介します
やっぱ簡単だけあって遅いの?
ソートの中では一番遅いかも。だからこれを使うことはないんだけど、こ
の例で説明するとわかりやすいからね
はーい
じゃあ、まずは概念から

4 9 3 5 8 

これを並べ替えます
こうなるよね

3 4 5 8 9 

今の、どういうふうにした?
ん? まず 3 が一番小さいから一番上に持ってきて
っていうふうにしたよね。それが一番基本的なアルゴリズム
? でもさ、それ以外ってあるの? それしかないような
僕らは、これを〈面〉で見るから、一瞬でどれが一番小さい数かわかるん
だけど、コンピューターの場合、全部ひとつひとつ見ていかなきゃいけない
でしょ
一度見たらいいんじゃない?
その見たのを記憶する、っていうのがコンピューターで言えば配列に入れ
ることなんだから
あ、それをまたひとつひとつ見なきゃいけないんだ……
だから、コンピューターのアルゴリズムは、この数字ひとつひとつをいち
いち見なきゃいけないんです
めんどくさー
だから色々方法がある、ってところかな。さて、さっき言ったように、基
本的には〈一番小さいのを見つける〉っていうことから始めるんだけど、そ
の際の方法にはいくつかあります
そだね、全部まず見て、小さいの取り出して取っておく、とか
そう。でも、その〈取っておく〉ってのが実はちょっと面倒なんです
なんで?
たとえば、2回〈小さいのを見つける〉をすると、こうなるでしょ

9 5 8 
3 4

こうすると、配列がもうひとつ必要になるんです
そっか、小さいのを入れとく配列も必要になるんだ……
そうすると new とか必要で面倒なんだよね。そこで、それを解決する方
法のひとつとして、元々の配列の端に入れておく、っていう方法がありま

端?
たとえば、小さいのふたつを頭のところに入れておくんです

3 4 9 5 8 

配列の要素の数はソート前と後で変わらないから、小さいのふたつを入れ
ておけるんです
でもこれだと、小さいのって取ったのもソートしちゃうんじゃない?
それを避けるために、どこまでがソート済みで、どこまでがまだソートし
てないか、っていうのを取っておく必要があります
それちょっと面倒そう
そうでもないよ。今のソートのやり方で全課程見てみればわかるかな

4 9 3 5 8 
3*4 9 5 8
3 4*9 5 8
3 4 5*9 8
3 4 5 8*9
3 4 5 8 9

 * の左側は〈一番小さいの〉で抜き出したもの、右側はまだ抜き出して
ないもの
この * の位置を憶えておくんだよね
でも実は憶える必要はないんです。なぜかっていうと、抜き出すたびに 
1 増えるだけだから。だから〈今何回目か〉だけわかればいいんです
そか、絶対に 1 ずつしか増えないからそれを利用すればいいんだ
1回目は5つ、2回目は4つ、っていう感じに減らしていけばいいしだけ
だからね。それともうひとつ、〈一番小さいの〉の取っておく方法
ん? 変数に入れておけばいいんじゃないの?
それだとちょっと面倒なんだよね。最初の

4 9 3 5 8 

を右から見ていって〈一番小さいの〉を持っておいて、それを左端に入れ
ると

3 4 9 5 8

になるわけだけど、これだと〈一番ちいさい数〉= 3 がどこにあるのか
っていうのを憶えておかないといけないんです

右から見ていって最後まで見たら〈 3 が一番小さい数字だった〉ってこ
とがわかるでしょ。でも、それがわかったあと、その 3 をまた探し出して
一番左端と入れ替える、っていうのは
二度手間だね。じゃあ配列の番号取っておけばいいんじゃない?
それも方法のひとつだけど、もう少し簡単な方法があります。それは、右
から見ていくときに、小さい数字があったらそれを左に持って行く方法


4 9 3 5 8 
      ^ ^

まず ^ がついてるものを比較します
 5 の方が小さいね
左側が小さいときには何もしないで、次を見ます

4 9 3 5 8 
    ^ ^

これも 3 の方が小さいね

4 9 3 5 8 
  ^ ^

これは 3 の方が小さいね
これは右側の方が小さいでしょ。そう言うときにはふたつの数を入れ替え
ます

4 3 9 5 8 

入れ替わった
で、次へ

4 3 9 5 8 
^ ^

これも 3 の方が小さいから入れ替えるの?
そう、だから

3 4 9 5 8 

になります
……あ、もしかして一番数が左端に来てる?
そういうこと。〈小さい数があったら入れ替えて左に持ってくる〉ってこ
とは、〈右側はそれまでの一番小さな数〉ってこと

4 9 3 5 8 
  ^ ^

って比較した時の右側の数字、 5 は、それまでで一番小さい数字。そう
なるように、右の方が小さい数だったら入れ替えるわけ

4 3 9 5 8 

そうすると、次に移ったとき

4 3 9 5 8 
^ ^

このときも、右側の数は
それまでで一番小さい 3 ってわけね
で、これを最後まで繰り返すと、自動的に

3 4 9 5 8 

というふうに一番小さな数が一番左端に来ます
おー
でもこれは〈一番小さな数〉を見つけただけ。次は〈二番目に小さな数〉
を探します

3 4 9 5 8 
      ^ ^

これは左の方が小さいからそのままね

3 4 9 5 8 
    ^ ^

これは右の方が小さいから入れ替えね

3 4 5 9 8 
  ^ ^

これは左の方が小さいからそのまま
で、ここで終わり
え、もう1個あるんじゃない?
さっき言ったでしょ、左端は〈小さい数を入れておくところ〉って
あ、そか、ここがそうなってるんだ……
だから、ここで終わり。1周するごと 1 減るから。で、3週目は

3 4 5 9 8 
      ^ ^

これは入れ替えね

3 4 5 8 9 
    ^ ^

これはそのまま。で、ここまでだよね
そう、さっきのひとつ手前だからね
4周目っと

3 4 5 8 9 
      ^ ^

これはそのまま。……あれ? これで終わり?
そう。ソートはこれで完了
こうして追っていけば簡単ね
まぁそれをコードに落とすのが大変なんだけど
げげ
ちなみに今回の方法は【バブルソート】って言います
バブル? 泡?
そう。縦に並べると、小さい数が上に昇っていくでしょ
それが泡っぽい?
そういうこと

/*
    Preview Next Story!
*/
なんか聞いてただけだった……
アルゴリズムを1から考えるなんて大変だもの
とりあえずは聞くだけでいい?
そういうのが積み重なっていけば、作れるようになるから
ホントかなー
というわけで次回
< Version 13.08 バブルソートのコーディング >
につづく!
何を学ぶのも最初はマネから!
なんかビミョーに嘘くさい……
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。