算法吧-堆排序

"""
排序思路:堆排序拿大根堆为例,是一个不断建初堆,调整堆的过程
建初堆:大根堆就是将树变成父亲节点永远大于左右孩子节点的堆
调整堆:大根堆把堆顶输出,最后一个元素移到堆顶,从新建堆
"""
def sift(li,low,high):
	"""
	:param li:
    :param low: 堆的根节点位置
    :param high: 堆的最后一个元素的位置
    :return:
	"""
	i=low   #i是最开始指向的节点位置
	j=2*i+1    #先看左孩子
	tmp= li[low]   # 把堆顶存起来
	while j<=high:    #只要堆顶下面的左孩子有数,说明一致没结束
		if j+1<=high and li[j+1]>li[j]:   #右孩子有并且比较大
			j=j+1   #j指向右孩子
		if li[j]>tmp:   #孩子的值比堆顶大
			li[i]=li[j]    #孩子的值移上去
			i=j       #i指向刚刚j的位置 
			j=2*i+1    #j变成了它现在i的左孩子
		else:        #否则堆顶更大,tmp放在i的位置上
			li[i]=tmp      #原先的值就较大,直接把tmp放到某一级大于其左右孩子的值上
			break
	else:
		li[i]=tmp   #tmp放到叶子节点上

 	def heap_sort(li):
    n=len(li)
    for i in range((n-2)//2,-1,-1):  #从0到最后一个节点的父节点
        #i表示建堆的时候调整堆的下标
        sift(li,i,n-1)  #n-1表示最后一个元素的下标
    #建堆完成
    #进入排序阶段
    for i in range(n-1,-1,-1):
        # i 指向当前堆的最后一个元素
        li[0],li[i]=li[i],li[0]  #把最后一个元素移到堆顶,堆顶元素存起来
        sift(li,0,i-1)  #i-1是新的high(新的最后一个元素的位置)

li=[8,2,5,6,1,4]
import random
#random.shuffle(li)
heap_sort(li)
print(li)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值