進捗

主にRubyを使用してます。

ヒープソート

問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書) | 大槻 兼資, 秋葉 拓哉 |本 | 通販 | Amazon

この本を読んでいて、ヒープソートの実装が割とスッと入ってきたので、メモを残しておく。

ヒープの条件

  • 頂点vの親頂点をpとしたとき、key[p]>=key[v]が成立する。
  • 木の高さをhとしたとき、木の深さh-1以下の部分については、完全二分木を形成している。
  • 木の高さをhとした時、木の深さhの部分については、頂点が左詰めされている。

引用:問題解決力を鍛える!アルゴリズムとデータ構造 (KS情報科学専門書) | 大槻 兼資, 秋葉 拓哉 |本 | 通販 | Amazon


実装(ruby)

class Array
  def heapify!(i, n)
    child1 = i * 2 + 1
    return if child1 >= n

    child1 += 1 if child1 + 1 < n && self[child1 + 1] > self[child1]
    return if self[child1] <= self[i]

    self[i], self[child1] = self[child1], self[i]
    heapify!(child1, n)
  end

  def heap_sort!()
    n = self.size
    (n / 2 - 1).downto(0) do |i|
      heapify!(i, n)
    end

    (n - 1).downto(1) do |i|
      self[0], self[i] = self[i], self[0]
      heapify!(0, i)
    end
  end
end

a = [12, 9, 15, 3, 8, 17, 6, 1]
a.heap_sort!
p a