​数据结构与算法从0开始炼代码(5)​

本文介绍了堆排序的原理及Python实现。通过`position_sort`和`heap_sort`两个函数,构建并调整小根堆,将堆顶元素依次放到数组末尾,最终完成排序。示例代码展示了对一组数字进行堆排序的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇文章写了快速排序的代码;

本文写堆排序的代码

堆排序本身不难理解,重要的是重新排小根堆或者大根堆的过程

代码部分

'''_*_coding:utf-8_*_
    author:zhangkai
    time:2022
'''
def position_sort(listt,first,end):    #传入数组和对应的左指针和右指针(小根堆)
    head=first
    tail=end
    i=head                              #i指向堆顶元素
    temp = listt[i]                     #保存堆顶元素
    j=2*i+1                             #j指向i的左孩子或右孩子结点
    while j<=tail:                       #j小于等于最后一个叶子节点
        if j+1<=tail:
            if listt[j+1]<listt[j]:         #右孩子小于左孩子时,右孩子上移
                j=j+1
        if listt[j]<listt[i]:           #孩子节点小于根节点时,孩子节点上移,并且继续子树的遍历寻找
            listt[i]=listt[j]
            listt[j]=temp
            i=j
            j=2*i+1
        else:                           #如果子节点都比父节点大了,下找终止,元素填入
            listt[i]=temp
            break
    else:
        listt[i]=temp                   #如果子节点都比父节点大,那只能把顶元素放在最后一个叶子结点

def heap_sort(lis,first,end):
    i=first
    n=end
    index=i
    for k in range((n-1)//2,-1,-1):     #这里是要构建小根堆,从叶子结点开始,从子树到完全树(n-1)//2是最后一个叶子结点的父节点
        position_sort(lis,k,n)
    for j in range(n):
        print("wei",lis)
        lis[n-j],lis[0]=lis[0],lis[n-j]     #把堆顶元素取出放到列表尾
        print(lis)
        position_sort(lis,0,n-j-1)          #重新构建小根堆
    #print(lis)

li=[5,8,1,6,9,0,4,7,2,3]
heap_sort(li,0,len(li)-1)
print(li)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值