ヒープじゃなくて単純な二分木を使ったソート。すなわち、
- 左の子は親よりも小さい
- 右の子は親よりも大きい
という構造。で、これを通りがけ順(左の枝、根、右の枝の順に調べる)に出力すると昇順にソートされる。
class BinaryTree def initialize(x) @val = x @left = nil @right = nil end def insert(x) if x < @val @left.nil? ? @left = BinaryTree.new(x) : @left.insert(x) else @right.nil? ? @right = BinaryTree.new(x) : @right.insert(x) end end def traverse(&block) @left.traverse(&block) unless @left.nil? block.call(@val) @right.traverse(&block) unless @right.nil? end end def sort(ary) btree = BinaryTree.new(ary.shift) ary.each{|x| btree.insert(x) } [].tap{|a| btree.traverse{|v| a << v } } end if $0 == __FILE__ sample = (1..100).to_a.sample(10) puts "unsorted: " + sample.inspect result = sort(sample) puts "sorted: " + result.inspect end
takatoh@nightschool $ ruby btree_sort.rb unsorted: [47, 97, 34, 39, 74, 44, 38, 5, 10, 53] sorted: [5, 10, 34, 38, 39, 44, 47, 53, 74, 97]