# -*- 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)
数据结构(三)堆排序
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...