008.排序算法——(二)选择排序——堆排序

008.排序算法——(二)选择排序——堆排序

1.算法思想

  • 升序,建立大根堆
  • 降序,建立小根堆
  • 数据利用列表存储
  • 步骤:
    • 升序,建立大根堆
    • 建立完成后,利用大根堆的结构,交换根结点和最下层最右侧的结点,最终形成升序序列

2.算法代码

# 堆调整函数
def heapify(arr, n, i): 
    # 坐标关系
    largest = i     # 根节点
    l = 2 * i + 1     # left = 2*i + 1 左叶子结点
    r = 2 * i + 2     # right = 2*i + 2 右叶子结点
  
    if l < n and arr[i] < arr[l]: # 根结点和左结点比较得到最大值索引
        largest = l 

    if r < n and arr[largest] < arr[r]: # 最大值索引和右结点比较得到新的最大值索引
        largest = r
  
    if largest != i:    # 最大值索引不是根节点(重新向下构建)
        arr[i],arr[largest] = arr[largest],arr[i]  # 交换
        heapify(arr, n, largest)    # 继续顺着交换之后的结点向下调整


def heapSort(arr): # 堆排序和堆调整
    n = len(arr)
    
    # 形成大根堆
    for i in range(n-1, -1, -1):  # 根据列表当中的数,从无到有建立(先从叶子结点开始,自底向上建立)
        heapify(arr, n, i)
    
    # 此时列表中存放的是一个大根堆

    # 一个个交换元素 
    for i in range(n-1, 0, -1): # 列表中的数从右到左开始调整
        arr[i], arr[0] = arr[0], arr[i]   # (将最后一层最右侧的结点和根结点进行交换)
        heapify(arr, i, 0)  # 重新进行大根堆的调整,调整之后arr[0]中会变成符合大根堆的值


arr = [ 12, 11, 13, 5, 6, 7] 
heapSort(arr) 
n = len(arr) 
print ("排序后") 
for i in range(n): 
    print ("%d" %arr[i])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值