【アルゴリズムの勉強】Rubyで分布数え上げソート(カウンティングソート、度数ソート)を書いてみる
アルゴリズムの勉強としてRubyで分布数え上げソート(カウンティングソート、度数ソートとも呼ばれる)を実装する。
分布数え上げソートとは
分布数え上げソートはソート対象のデータをキーにして、キーの出現回数とその累積度数分布を計算して利用することで整列を行うアルゴリズムです。 バケットソートと同じくキーとなるデータがとりうる値の範囲をあらかじめ知っている必要があります。バケットソートとの違いはキーの重複に対応したアルゴリズムであるということです。
Rubyで実装
arr = [4, 20, 6, 10, 2, 15, 60, 9, 25, 12, 9] number_of_elements = arr.count max = arr.max def counting_sort(arr, number_of_elements, max) counting_arr = Array.new(max + 1, 0) answer = [] for i in 0..(number_of_elements - 1) counting_arr[arr[i]] += 1 end for i in 1..max counting_arr[i] += counting_arr[i - 1] end (number_of_elements - 1).downto(0) {|i| key = counting_arr[arr[i]] - 1 answer[key] = arr[i] counting_arr[arr[i]] += -1 } return answer end sorted_arr = counting_sort(arr, number_of_elements, max) p sorted_arr # => [2, 4, 6, 9, 9, 10, 12, 15, 20, 25, 60]
参考文献、参考リンク
- 明解 Javaによるアルゴリズムとデータ構造
- 分布数え上げソート : アルゴリズム