python数据处理--堆排序算法

本文详细介绍了一种高效的排序算法——堆排序。首先构建大顶堆,随后通过不断交换堆顶元素和末尾元素,并重新调整堆结构来实现排序。文中提供了详细的Python实现代码,并通过实例演示了整个排序过程。

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

堆排序思路:

  1. 构建大顶堆(小顶堆)
  2. 交换堆的首尾元素,堆长度减一
  3. 交换首尾元素后,验证堆的合规性,若不合规则调整数据位置,直至合规
  4. 重复2和3步骤,直至长度为0,结束

python实现_问题分析:

  • 问题1:如何构建初始堆
  • 问题2:序列长度与节点数量的关系(node=round(length))
  • 问题3:每个父节点与子左节点、右节点的大小关系(father>left and father >right)
  • 问题4:父节点序号与子节点序号的关系(假设节点需要从1开始,那么left=2father,right=left+1)
  • 问题5:交换首尾元素后,如何验证堆的合规性(即父节点与子节点的大小关系),若不合规,则如何调整直至合规(收敛函数如何构建)

python实现_处理思路:

  • 构建sweap_heap函数验证父节点与子节点关系并规整堆
  • 利用sweap_heap函数从尾至前构建初始堆
  • 依据构建的初始堆,进行首尾元素交换并利用sweap_heap函数继续验证堆,并调整堆
  • over

代码如下:

def Heap_sort(args_list):
    args_len=len(args_list)
    i=args_len//2
    #构造大顶堆
    while i >0:
        node=i
        sweap_heap(args_list,node,args_len)
        i-=1
    #进行大顶堆元素依次处理
    while args_len>0:
        #交换首尾元素
        args_list[0],args_list[args_len-1]=args_list[args_len-1],args_list[0]
        args_len-=1
        n=1
        sweap_heap(args_list,n,args_len)   
    return args_list
#构建函数,验证堆属性,并调整元素位置,使其满足堆要求
def sweap_heap(args_list,node,args_len):
    while True:
       father_node=node 
       left_node=2*node
       rigth_nde=2*node+1
       if left_node>args_len:
           break
       else:
           if rigth_nde<=args_len and args_list[left_node-1]<args_list[rigth_nde-1]:
                    left_node+=1
           if args_list[left_node-1]>args_list[father_node-1]:
               args_list[father_node-1], args_list[left_node-1]=args_list[left_node-1],args_list[father_node-1]
               node=left_node  
           else:
               break

验证一下:

args_list=[721, 8789, 6277, 1942, 7102, 1824, 7918, 3177, 2919, 9064]
#print (args_list)
start_time=time.clock()
aa=Heap_sort(args_list)
end_time=time.clock()
#print (end_time-start_time)
print (aa)
[721, 1824, 1942, 2919, 3177, 6277, 7102, 7918, 8789, 9064]

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值