1. 程式人生 > >python資料處理--堆排序演算法

python資料處理--堆排序演算法

堆排序思路:

  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]