python算法9.12——堆排序

# 堆排序,利用堆进行排序
# 堆是一种完全二叉树,分为大根堆、小根堆
# 大根堆:每个父节点大于等于子节点;小根堆:每个父节点小于等于子节点
# 算法原理(升序):
# 1.构造大根堆
# 2.将堆顶点与最右下进行交换(最值右移)
# 3.除最右下值(最大值)外,构造大根堆
# 4.重复实现升序
# 实现过程:
#参考 https://blog.csdn.net/minxihou/article/details/51850001

import random

def MAX_Heapify(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]
        MAX_Heapify(heap, HeapSize, larger)

def Build_MAX_Heap(heap):                   #构造一个堆,将堆中所有数据重新排序
    HeapSize = len(heap)                    #将堆的长度当独拿出来方便
    for i in range((HeapSize -2)//2,-1,-1):#从后往前出数
        MAX_Heapify(heap,HeapSize,i)

def HeapSort(heap):
    Build_MAX_Heap(heap)
    for i in range(len(heap)-1,-1,-1):      #将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。
        heap[0],heap[i] = heap[i],heap[0]
        MAX_Heapify(heap, i, 0)
    return heap

if __name__ == '__main__':
    Range = 100
    Length = 11
    list = random.sample(range(Range), Length)  # 在指定序列中随机获取指定长度片段
    print('before sort:', list)
    HeapSort(list)
    print('after sort:', list)

猜你喜欢

转载自blog.csdn.net/nominior/article/details/82669401
今日推荐