python資料處理--堆排序演算法
阿新 • • 發佈:2018-12-10
堆排序思路:
- 構建大頂堆(小頂堆)
- 交換堆的首尾元素,堆長度減一
- 交換首尾元素後,驗證堆的合規性,若不合規則調整資料位置,直至合規
- 重複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]