python数据处理--类堆排序(堆末尾排序)

本文介绍了一种类似于堆排序的算法——类堆排序,并详细解释了其工作原理及实现过程。该算法通过构建类似大顶堆的数据结构进行排序,虽然在序列长度较长时效率较低,但对于理解堆排序的概念及实现具有一定的参考价值。

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

类堆排序(堆末尾排序)---不知道起什么名字,原以为是堆排序,后来才发现对堆排序理解有误,但本身也可以实现序列的排序,且思路比堆排序要简单,缺点就是当序列长度较大时,运算量过大,不过整理思路可借鉴。

类堆排序思路:

  1. 构建类似大顶堆(小顶堆)【即整体为二叉树结构,只考虑单独的每次父节点与子节点大小关系,不考虑后续节点的交换产生的影响】--构建完成后最顶端为本次构建序列中的最大值
  2. 交换堆的首尾元素(将最大元素移至末尾),堆长度减一
  3. 重复1和2步骤,直至长度为0,结束

代码如下:

import numpy as np
import time
def Heap_sort(args_list):
    args_lenth=len(args_list)
    if args_lenth == 2 :
        return max(args_list),min(args_list)
    elif args_lenth == 1:
        return args_list
    else:
        while args_lenth>2:
            args_lenth-=1  
            #print (args_list)
            switch_heap(args_list,args_lenth)
    return args_list

def switch_heap(args_list,args_lenth):
    n=args_lenth
    if (args_lenth % 2)!=0:
        if args_list[(args_lenth+1)//2]<args_list[args_lenth]:
            args_list[(args_lenth+1)//2],args_list[args_lenth]=args_list[args_lenth],args_list[(args_lenth+1)//2]
        while args_lenth>2:
            args_lenth-=2
            args_list[(args_lenth-1)//2],args_list[args_lenth],args_list[args_lenth+1]=compare_heap(args_list[(args_lenth-1)//2],args_list[args_lenth],args_list[args_lenth+1])
    else:
         while args_lenth>0:
            args_list[(args_lenth-2)//2],args_list[args_lenth-1],args_list[args_lenth]=compare_heap(args_list[(args_lenth-2)//2],args_list[args_lenth-1],args_list[args_lenth])
            args_lenth-=2
    args_list[0],args_list[n]=args_list[n],args_list[0]
 
           

def compare_heap(args_a,args_b,args_c):
    args_array=np.array([args_a,args_b,args_c])
    a,c=args_array.max(),args_array.min()
    sum_minlen=sum(args_array==c)
    sum_maxlen=sum(args_array==a)
    if sum_minlen==2 or sum_minlen==3:
        b=c
    elif sum_minlen==1 and sum_maxlen==2:
        b=a
    else:
        b=args_array[(args_array !=a)==(args_array !=c)][0]
    args_a,args_b,args_c=a,b,c
    return args_a,args_b,args_c

测试一下(顺便测试一下效率):

args_list=np.random.randint(1,10000,[10]).tolist()
Heap_sort(args_list)
Out[48]: [665, 777, 1455, 2218, 3392, 3703, 4720, 6604, 8668, 9455]

效率测试:

args_list=np.random.randint(1,10000,[1000]).tolist()
start_time=time.clock()
Heap_sort(args_list)
end_time=time.clock()
print (end_time-start_time)
10.617314764749608

!__!   1000个元素就用了10秒。。。。有同学知道是为什么吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值