简介
堆(一般为小顶堆):
- 完全二叉树 (从上往下,从左往右)
- 父节点的值一定小于子节点的值
堆排序主要分为三部分:
3. 对一个杂乱无章的list创建堆结构,利用数组下标来初始二叉树。从倒数第二层开始向上从右往左构建最大堆
4. 对子树均为堆结构的根部分进行heapify(比较父节点的值和两个子节点的值,若父节点不是最小则交换最小值的子节点和父节点)
5. 对于一个最大堆其首字符必为整个堆中的最小值,将其弹出存储后,对剩余部分再重复2
堆插入:插入到最后一个叶子后面,在从下往上对每一个父节点进行heapify
堆删除:将根节点与最后一个叶子互换,砍掉这个叶子,然后从根开始heapify一次
代码
def Heapify(heap,HeapSize,root):
#在堆中做结构调整使得父节点的值大于子节点,已经保证所有子树都是堆,只有根不符合堆的定义
if root>=HeapSize:
return
c1=2*root + 1#根部左节点
c2=2*root + 2#根部右节点
mini=root#先设置根为最小节点
if c1<HeapSize and heap[c1]<heap[mini]:
mini=c1
if c2<HeapSize and heap[c2]<heap[mini]:
mini=c2
if mini!=root:
heap[mini],heap[root]=heap[root],heap[mini]#将最小值换到根
Heapify(heap,HeapSize,mini)#mi这个节点向下继续建堆
def Heapinsert(heap, n, num = None):
#构造一个堆,如果有插入则从最后一位插入,再从倒数第二层开始网上构建堆
if num != None:
heap.append(num)
n += 1
last=n-1#从序列的最末端开始建堆
parent=int(last/2)#找到倒数第二层最后一个父节点
for i in range(parent,0,-1):
#从倒数第二层开始递减向上构建堆
Heapify(heap,n,i)
def HeapSort(heap):
#将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。
for i in range(len(heap)-1,0,-1):
heap[0],heap[i]=heap[i],heap[0]
Heapify(heap,i,0)
return heap
def Heappop(heap):
#将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。
heap[0],heap[-1]=heap[-1],heap[0]
tmp = heap.pop(-1)
Heapify(heap,len(heap),0)
return tmp
if __name__ == '__main__':
nums=[1,20,3,4,1,9,5]
print(nums)
#构建堆
Heapinsert(nums, len(nums))
Heapinsert(nums, len(nums), 2)
print(nums)
while nums!=[]:
print(Heappop(nums))