![]() |
|||||||||||||||||||||||
(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); }
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 上のタイトルをクリックします |
|||||||||||||||||||||||