バケットソート [Bucket Sort]

バケットソート(ビンソート [Bin Sort] とも呼ばれる)はあらかじめデータがとりうる値すべての容器を順番どおりに並べて用意しておき、値を対応する容器に移すことでソートを行う整列アルゴリズムです。

データがとりうる値がわかっていなければソートのためのバケツ [Bucket] を準備することができないのでこのアルゴリズムは使えません。

アルゴリズム分析

前提としてソート対象のデータは 1 から 10 の整数とします。

  1. 1 から 10 に対応する10個のバケットを順に並べて用意する
  2. データを対応するバケットに入れる
  3. バケットから順にデータを取り出す

このような方法で整列されたデータを得ることができます。

ソート対象のデータは必ず10個存在するとは限りません。1 から 5 までの5個しかデータがなくてもバケットは10個用意する必要があります。6 から 10 のバケットはデータを取り出す際に無視することで 1 から 5 のデータだけを整列させるのです。

特徴

冒頭で述べたようにソート対象のデータがとりうる値をあらかじめわかっていなければバケットの用意ができないので、このアルゴリズムは使えません。また、バケットという作業領域が必要になるのでデータの範囲が大きすぎるとバケットのための領域(メモり)を確保できません。データの範囲が1から1024として、バケット1つに 1byte の領域が必要になるのならバケットを用意するだけで 1kb の領域が必要になります。データの範囲が100,000、1,000,000 と大きくなることを想像すれば大きな範囲のデータが扱えないことは理解できるでしょう。

もうひとつ、ソート対象のデータは重複が許されないということです。バケットは想定される値をキーとして用意されます。ですから同値が存在しても対応する複数のバケットを用意できないのです。もちろんこの問題を解決した別のアルゴリズムがあります。

サンプルコード

C言語

配列を昇順に整列させます。

#define M 10 /* データ範囲の最大値 */

/**
 * numbers[] ソート対象の配列
 * number_of_item ソートの対象となるデータの個数。numbers中のソートさせたいデータの数。
 */
void bucket_sort(int numbers[], int number_of_item)
{
    int buckets[M];
    int i; /* ループカウント変数 */

    /* prepare buckets バケットを用意 */
    for (i = 0; i < M; i++) {
        buckets[i] = 0;
    }
    /* putting in bucket 元のデータをバケットに入れる*/
    for (i = 0; i < number_of_item; i++) {
        buckets[numbers[i]] = numbers[i];
    }
    /* back into the original array バケットから元の配列に戻す*/
    int j = 0; /* 配列のインデックス */
    for (i = 0; i < M; i++) {
        if (0 < buckets[i]) {
            numbers[j++] = buckets[i];
        }
    }
}
バケットソートのデモンストレーション プログラム: bucket_sort.c


$Date: 2008-06-28 00:27:19 +0900 (Sat, 28 Jun 2008) $