数据结构(三)堆排序

# -*- 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)

你可能感兴趣的:(数据结构(三)堆排序)