类堆排序(堆末尾排序)---不知道起什么名字,原以为是堆排序,后来才发现对堆排序理解有误,但本身也可以实现序列的排序,且思路比堆排序要简单,缺点就是当序列长度较大时,运算量过大,不过整理思路可借鉴。
类堆排序思路:
- 构建类似大顶堆(小顶堆)【即整体为二叉树结构,只考虑单独的每次父节点与子节点大小关系,不考虑后续节点的交换产生的影响】--构建完成后最顶端为本次构建序列中的最大值
- 交换堆的首尾元素(将最大元素移至末尾),堆长度减一
- 重复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秒。。。。有同学知道是为什么吗?