堆排序是指利用堆积树(堆)这种数据结构设计的排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引元素。堆分为大根堆和小根堆,是完全二叉树;大根堆的要求是每个节点的值都不大于其父节点的值,A[PARENT[i]]>=A[i]。再数组的非降序排序中,需要使用的是大根堆。跟进大根堆的要求可知,最大的值一定再堆顶。
# -*- coding: utf-8 -*- """ 下标: 0,1,2,3,4 列表:[2,5,1,9,0] 2*i+1<size i<(size-1)//2 """ # 1、构建堆 def maxHeapify(heap, heapSize, root): # 再堆中,做结构调整使得父节点的值大于子节点的值 left = 2 * root + 1 right = left + 1 larger = root if left < heapSize and heap[larger] < heap[left]: larger = left if right < heapSize and heap[larger] < heap[right]: larger = right if larger != root: # 如果做了堆调整则larger的值等于左节点或者右节点的,这个时候对调值操作 heap[larger], heap[root] = heap[root], heap[larger] maxHeapify(heap, heapSize, larger) # 2、构建排序 def heapSort(heap): # 构建大顶堆 heapSize = len(heap) # 堆的长度 for i in range((heapSize-1) // 2, -1, -1): # 从后往前出数,从下至上的构建大顶堆 maxHeapify(heap, heapSize, i) # 将根节点与最后一个元素交换位置,重新调整为大顶堆,分别与后续位置交换 for i in range(len(heap) - 1, -1, -1): heap[0], heap[i] = heap[i], heap[0] # 构建局部大顶堆 maxHeapify(heap, i, 0) return heap if __name__ == ‘__main__‘: import numpy as np li=np.arange(10) print(li) heapSort(li) print(li)
原文:https://www.cnblogs.com/bashliuhe/p/14992155.html