バブル法によるソート


関数名
bubbleSort  バブル法によるソート
形式
void bubbleSort(DATA *data, int nmem, int asdes);
引数
typedef struct {
    int key;        /* 比較のキーとなるフィールド */
    int info;       /* その他のフィールド */
} DATA;

data   (入出力)データレコードの配列
nmem   (入力)  レコード配列の大きさ
asdes  (入力)  昇順・降順別、0:昇順, 1:降順
関数値
なし
注意事項

用例(bubbleSort-test.c

プログラム(bubbleSort.c
void bubbleSort(DATA *data, int nmem, int asdes)
{
    int i, j;
    static void swap();

    for (i = 0; i < nmem - 1; i++) {
        for (j = nmem - 1; j >= i + 1; j--)
            if (asdes == 0) {
                if (data[j].key < data[j-1].key)
                    swap(&data[j], &data[j-1]);
            } else {
                if (data[j].key > data[j-1].key)
                    swap(&data[j], &data[j-1]);
            }
    }
}
 
static void swap(DATA *a, DATA *b)
{
    DATA t;

    t.key   = a->key;
    t.info  = a->info;
    a->key  = b->key;
    a->info = b->info;
    b->key  = t.key;
    b->info = t.info;
}
説明
縦方向一列に並んだレコードの中で、値の小さいレコード(昇進 の場合)は軽く、泡(バブル)のように上に浮かんでいく、というよう にイメージすれば分かりやすい。

まず下から全体を走査して、隣接する2つのレコードの大小順序が狂った とき、2つを入れ換える。この走査で、一番値の小さい(軽い)レコード が1番上に浮かびあがる。つぎに下から上2つ目のレコードまで走査して 隣り同士を必要に応じて入れ換えることにより、その中の最小のものが 上から2つ目のレコードに浮かびあがる。このように最後のレコードまで 繰り返して終了する。

利用するには、データ構造を実際の問題に合わせて修正する必要がある。

関連関数
挿入ソート選択ソートシェルソートクイックソート