ビッグO記法とヒープソートの解説


ヒープソートは、最大ヒープと呼ばれる特殊なデータ構造を使用します。最大ヒープは、要素が親ノードよりも大きいという条件を満たす二分木です。ヒープソートでは、まずソート対象の配列を最大ヒープに変換し、その後、最大ヒープから最大値を順に取り出してソート済みの配列を作成します。

以下に、ヒープソートの基本的な手順を示します。

  1. ソート対象の配列を最大ヒープに変換する(ヒープ化)。
  2. 最大ヒープから最大値を取り出し、ソート済みの配列に追加する。
  3. ヒープのサイズを1つ減らして、ヒープを再構築する。
  4. ヒープのサイズが1より大きい場合、手順2に戻る。

ヒープソートは、最悪時間計算量がO(n log n)であり、一般的に高速なソートアルゴリズムとされています。以下に、Pythonでのヒープソートの実装例を示します。

def heapify(arr, n, i):
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2
    if left < n and arr[i] < arr[left]:
        largest = left
    if right < n and arr[largest] < arr[right]:
        largest = right
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)
def heap_sort(arr):
    n = len(arr)
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)
    return arr
# 使用例
arr = [12, 11, 13, 5, 6, 7]
sorted_arr = heap_sort(arr)
print(sorted_arr)

このコードは、与えられた配列をヒープソートによって昇順にソートします。ヒープソートの基本的なアイデアと、再帰的なheapify関数の使い方が分かるかと思います。

ヒープソートは、大量のデータを効率的にソートするための強力なツールです。ビッグO記法とヒープソートの理解を深めることで、さまざまなアルゴリズムやデータ構造に応用することができます。