定义
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
堆排序可以说是一种利用堆的概念来排序的选择排序。
堆排序步骤
堆可以分为大根堆和小根堆,这里用最大堆的情况来定义操作:
(1) 最大堆调整(max_heap)
(2) 建立最大堆(build_max_heap)
(3) 堆排序(heap_sort)
堆节点位置
在阵列起始位置为0的情况:
(1) 父节点 i 的左子节点在位置(2i+1)
(2) 父节点 i 的右子节点在位置(2 i+2)
(3) 子节点 i 的父节点在位置floor((i-1)/2)
代码
# 调整堆的结构,使其父节点的值大于子节点的值
def max_heap(heap, heapsize, root):
left = 2*root+1
right = left + 1
large = root
if left < heapsize and heap[large] < heap[left]:
large = left
if right < heapsize and heap[large] < heap[right]:
large = right
# 若large=right或large=left,则说明,出现比父节点大的子节点,这时对调,使子节点变为父节点
if large != root:
heap[large], heap[root] = heap[root], heap[large]
max_heap(heap, heapsize, large)
# 构造一个堆,对堆中数据重新排序
def build_max_heap(heap):
length = len(heap)
# 从后往前调整结构
for i in range((length-2)//2,-1,-1):
max_heap(heap, length, i)
# 将根节点取出与最后一位对调,对前面len-1个节点继续进行对调过程
def heap_sort(heap):
build_max_heap(heap)
for i in range(len(heap)-1,-1,-1):
heap[0], heap[i] = heap[i], heap[0]
max_heap(heap,i,0)
return heap
heap_sort([30,50,57,77,62,78,94,80,84])