堆排序思路:
- 构建大顶堆(小顶堆)
- 交换堆的首尾元素,堆长度减一
- 交换首尾元素后,验证堆的合规性,若不合规则调整数据位置,直至合规
- 重复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]