• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

ヒープソート

date: 2021-03-24 excerpt: ヒープソートについて

tag: sortalgorithmheap sort


ヒープソートについて

概要

  • 二分ヒープ木を用いてソートを行うアルゴリズム

動作

  1. 未整列のリストから要素を取り出し、順にヒープに追加
  2. ルート(最大値または最小値)を取り出し、整列済みリストに追加
  3. 動作範囲を制限して1に戻る

実装

def heapify(arr, max_n, i):
    # 最大の値を持つindexを探し先頭に持ってくる
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2
    if l < max_n and arr[i] < arr[l]:
        largest = l

    if r < max_n and arr[largest] < arr[r]:
        largest = r

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, max_n, largest)


def hsort(arr):
    n = len(arr)
    for i in range(n//2, -1, -1):
        heapify(arr, n, i)
    for i in range(n-1, 0, -1):
        # heapifyで先頭が最大値になっているので末尾に持ってくる
        arr[i], arr[0] = arr[0], arr[i]
        # heapifyで最大値を先頭に
        heapify(arr, i, 0)


arr = [1, 12, 9, 5, 6, 10]
print(arr)  # [1, 12, 9, 5, 6, 10]
hsort(arr)
print(arr)  # [1, 5, 6, 9, 10, 12]

参考

  • Heap Sort Algorithm@Programiz
  • ヒープソート@Wikipedia


sortalgorithmheap sort Share Tweet