MMGamesロゴ  MMGames
Twitterシェアボタン  Facebookシェアボタン   
 English 

しんで覚えるC言語
しんで覚えるC言語

バブルソート

整列(ソート)とは
整列(ソート)とは、でたらめに並べられたデータを順番通りに並び替えることです。
たとえば、次のように並び替えます。

ソート前 23 9 7 15 3 1 30 19
ソート後 1 3 7 9 15 19 23 30

この時、左に行くほど値が小さくなるソートを昇順と呼びます。
反対に、右に行くほど値が小さくなるソートは降順です。

また、ソートでは、安定性が必要なことがあります。
安定とは、ソート後に、同じ値のデータの並び順が変化しないことです。

たとえば、次はあるクラスの小テストの結果だとします。

生徒名 点数
野比のび太 0
源静香 90
剛田武 50
骨川スネ夫 50

これを安定な方法で並び替えると次のようになります。

生徒名 点数
野比のび太 0
剛田武 50
骨川スネ夫 50
源静香 90

同じ点数である剛田武と骨川スネ夫の前後関係はソートする前と同じです。
次は、非安定な方法で並び替えます。

生徒名 点数
野比のび太 0
骨川スネ夫 50
剛田武 50
源静香 90

同じ点数である剛田武と骨川スネ夫の前後関係が入れ替わっています。
場合によっては、同じ点数の人の並び順を保持する必要があり、
その場合には安定した方法を使わなければなりません。

ソートの目的
もともとでたらめに並んでいたのならそのままにしておけばよいのに、
わざわざそれをソートする理由は、ズバリ検索の高速化のためです。
データがそろえられていると、目的の値がどこにあるか見当がつき、
データがでたらめに並んでいる場合よりも素早く検索できます。

バブルソート
ソートには実にさまざまなアルゴリズムが考案されていますが、
その中でもバブルソートは、プログラムのわかりやすさからよく取り上げられます。
ただし、速度は遅いため、あまり優秀な方法とはいえません。

その考え方は簡単です。
まず、1つ目と2つ目のデータを比べ、2つ目が小さい場合はデータを交換します。
次は、2つ目と3つ目を比較して交換します。これをデータの最後まで繰り返します。
データの最後まできたら、また1つ目から比較と交換を繰り返します。
これをデータの個数回だけ繰り返せば、データが整列されます。

1つ目と2つ目の比較 (23) ( 9) 7 15 3 1 30 19
2つ目が小さいので交換 ( 9) (23) 7 15 3 1 30 19
2つ目と3つ目の比較 9 (23) ( 7) 15 3 1 30 19
3つ目が小さいので交換 9 ( 7) (23) 15 3 1 30 19

このようにして、並び替えが終わるまで、2個間での並び化を繰り返すのが、バブルソートです。

バブルソートをプログラムとして実装すると次の通りになります。

ソースコード
/* 
使用法
SortBubble(ソートする配列、ソートする個数);
*/
void SortBubble(int array[], int n)
{
    int i, j, temp;

    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1; j++)
        {
            if (array[j + 1] < array[j])
            {
                temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

動作を確認する場合は、arrayの型をcharとして、文字配列を渡すのが簡単です。

バブルソートでは2重のループを使うため、計算回数は O(N^2) となります。
これは、計算量目安の中で、右から3番目の算量に相当してしまいます。

計算量
1、log2n、n、nlog2n、n^2、2^n、n!

バブルソートはそれなりに計算量が多くなるアルゴリズムであり、あまり優秀とは言えません。


本サイトについて

苦しんで覚えるC言語(苦C)は
C言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。

第0部:プログラム概要編
  1. プログラムとは何か?
2章:プログラムの書き方
  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2
3章:画面への表示
  1. 文字列の表示
  2. 改行文字
  3. 練習問題3
6章:キーボードからの入力
  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6
9章:回数が決まっている繰り返し
  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9
10章:回数がわからない繰り返し
  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10
13章:複数の変数を一括して扱う
  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13
20章:複数のソースファイル
  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20

コメント
COMMENT

💬 コメント投稿欄を開く