バブルソート

概要

アルゴリズムが単純で実装が容易なため、しばしば用いられます。
配列において、隣り合う要素の値を総当たりで比較するため、処理時間はかかりますが、安定な内部ソートを実現します。

アルゴリズム

 以下の配列 array に対する昇順ソートを行うとします。

array [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 1 0 3 2 0 1 2 0 1

題意より、常に [i] の値は [i + 1] の値以下となり、最小値は arrray[0] 、最大値はarray[9] に置かれます。

まず、[0]と[1]を比較し、順番が逆であれば位置を交換します。次に、[1]と[2]を比較し、順番が逆であれば位置を交換します。

array [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 0 1 3 2 0 1 2 0 1

これを最後まで(ここでは[8]と[9]まで)行うと、最後の数だけが最小または最大の数として確定します。

array [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 0 1 2 0 1 2 0 1 3

 

確定していない部分について繰り返します。

array [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 0 1 0 1 2 0 1 2 3

array [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 0 1 0 1 0 1 2 2 3

array [0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
0 0 0 0 1 1 1 2 2 3

プログラムソース

 倍精度実数配列に対するソースを示します。ここで、配列の要素数は、配列の定義等によって既知であるとします。
 数値配列に対する汎用性を考慮しており、このまま使用する場合は、引数にあたる配列のデータ型をキャストしてください。

/* バブルソート(昇順) */
/* array ... ソートを行う配列 */
/* n     ... array の要素数 */

void bubblesort(double array, int n)
{
    int       i, j;    /*繰り返し作業のためのカウンタ*/
    double    temp;    /*値交換の仲介用の変数*/

    for(i = n-1; i > 0 ; i--)
        /*外側ループ: 以下の作業を配列要素の個数分(n回)だけ繰返す(配列の末尾-大きな値-から順序を確定する)*/
    {
        for(j = 0; j < i; j++)
            /*内側ループ: 以下の作業を順序が確定していない要素の個数分だけ繰り返す*/
        {
            if(array[j] > array[j+1])
                /*小さな要素番号の値 > 大きな要素番号の値*/
            {
                /*位置を交換する*/
                temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
}

関連項目

更新履歴

2008/07/25: 作成


Back / Studying / Top