  
| 番号 |
以下をクリックすると,該当箇所にジャンプします |
| (1) |
ヒープ |
| (2) |
完全2分木の配列による表現 |
| (3) |
ヒープソート |
| (4) |
ヒープの構築 |
(1)度数ソートの考え方
度数ソートでは,累積度数分布表を作成し,
累積度数分布表を利用してソートを行います。
テストの点数など, 取りうる値の範囲が決まっているときに有用です。

(2)度数ソートの手順
度数ソートは,次のような手順で行います。
@)度数分布表の作成
各点数の学生が何人いるかを示す度数分布表を作成します。
A)累積分布表の作成
その点数以下の学生が何人いるかを示す累積度数分布表を
作成します。
B)目的配列の作成
原配列と累積度数分布表をつき合わせてソート済み配列を
作成します。
(3)度数分布表の作成
このためには,値の最大値+1のサイズの配列を用意し,
各点数をカウントします。

(4)累積度数分布表の作成
この処理は,度数分布表の前の値にその位置の値を加えるだけです。

(5)目的配列の作成
まず,原配列と同じサイズの配列を用意します。
そして,原配列の最後から前の方にスキャンしながら
累積度数分布と突合せます。
以下の例では,最後の値が5ですから,
累積度数分布の添え字5の要素をみると6ですから,
5点以下の学生が6人いることになります。
すなわち,5点の学生は6位となります。
したがって,目的配列の6番目(配列添え字は5)に5点を入れます。
この際,該当する累積度数分布表の値をデクリメント(−1する)
しておきます。
すなわち,累積度数分布の添え字5の部分は6から5に変わります。
同様に前の値を付き合わせます。
3点の学生は3番目(配列添え字=2)に入ります。

同様に前の値を付き合わせます。
5点の学生が入る位置は,以前デクリメントされていますから,
5番目に変わっていますので,
配列添え字4の位置に入ることになります。
すなわち,累積度数分布表をデクリメントしているのは,
同一の値がある場合に対応するためです。

このようにして,順次,前方向に付き合わせながら,
目的配列に入れていきます。


[プログラム]
private void FrequencySort(ref int[]
a, int max)
{
int i;
int[] 度数 = new int[max+1];
int[] temp = new int[a.Length];
for(i=0; i<度数.Length; i++) 度数[i]=0;
for(i=0; i< a.Length; i++) 度数[a[i]]++;
for(i=1; i<度数.Length;
i++) 度数[i]
+= 度数[i-1];
for(i=a.Length-1; i>=0; i--) temp[--度数[a[i]]]
=a[i];
for(i=0; i<a.Length; i++) a[i]=temp[i];
}
private void 度数ソート()
{
FrequencySort(ref Data,100);
}
  
| 番号 |
以下をクリックすると,該当箇所にジャンプします |
| (1) |
ヒープ |
| (2) |
完全2分木の配列による表現 |
| (3) |
ヒープソート |
| (4) |
ヒープの構築 |
1. 基本的なアルゴリズム
2. 基本的なデータ構造
3. 操作を伴うデータ構造
4. 探索
5. 再帰的アルゴリズム
6. ソート
7. 集合
8. 文字列処理
9. 色々なアルゴリズム

上のタイトルをクリックします
|