# -*- coding: UTF-8 -*-
# 堆排序,一开始先构建一个大顶堆,然后循环,将最大值从第 0 个位置换到“当前最后一个位置”,再对剩余的节点进行调整,构造出一个新的大顶堆
def heap_sort(arr, size):
build_heap(arr, size)
for i in range(size - 1, -1, -1):
temp = arr[0]
arr[0] = arr[i]
arr[i] = temp
adjust_heap(arr, i - 1, 0)
return arr
# 构建大顶堆,从最后一个节点开始,不断进行调整堆的操作
def build_heap(arr, size):
for i in range(size - 1, -1, -1):
adjust_heap(arr, size, i)
# 对指定节点的值进行调整,与左右孩子进行比较,找出最大值,替换到该节点
def adjust_heap(arr, size, i):
left = i * 2 + 1
right = i * 2 + 2
max_pos = i
if left <= size - 1 and arr[left] > arr[max_pos]:
max_pos = left
if right <= size - 1 and arr[right] > arr[max_pos]:
max_pos = right
# 当前节点的值和其左右孩子相比,不是最大的,则把最大值与当前节点值进行交换
if max_pos != i:
temp = arr[max_pos]
arr[max_pos] = arr[i]
arr[i] = temp
# 递归对原来为最大值的节点再做一次调整
adjust_heap(arr, size, max_pos)
# 待排序
A = [1, 2, 3, 5, 2, 3]
result = heap_sort(A, len(A))
print(result)
网友评论