ヒープソート: 山のルールで最大値を取り出そう
ヒープソートは、「親の数字は子どもの数字以上」という山のルールを作って、いちばん大きい数字を何度も取り出す並び替えです。
少しむずかしいですが、大きな数字をすばやく見つけるための考え方を学べます。
ルール
- 数字をヒープという形に並べる
- いちばん大きい数字を後ろへ移動する
- 残った数字でヒープの形を直す
- これをくり返す
図で見る
コピペ用コード
def heap_sort(numbers):
result = numbers[:]
def heapify(size, root):
largest = root
left = 2 * root + 1
right = 2 * root + 2
if left < size and result[left] > result[largest]:
largest = left
if right < size and result[right] > result[largest]:
largest = right
if largest != root:
result[root], result[largest] = result[largest], result[root]
heapify(size, largest)
for i in range(len(result) // 2 - 1, -1, -1):
heapify(len(result), i)
for end in range(len(result) - 1, 0, -1):
result[0], result[end] = result[end], result[0]
heapify(end, 0)
return result
print(heap_sort([5, 3, 8, 1, 4]))