1. 程式人生 > >演算法學習_python-9

演算法學習_python-9

堆排序:

# -*- coding:utf-8 -*- # 堆排序適用於記錄數很多的情況 from collections import deque # 這裡需要說明元素的儲存必須要從1開始 # 涉及到左右節點的定位,和堆排序開始調整節點的定位 # 在下標0處插入0,它不參與排序 #L = deque([1,3,2])

def element_exchange(numbers,low,high):   temp = numbers[low]   # j 是low的左孩子節點(cheer!)   i = low   j = 2*i   while j<=high:     # 如果右節點較大,則把j指向右節點     if j<high and numbers[j]<numbers[j+1]:       j = j+1     if temp<numbers[j]:       # 將numbers[j]調整到雙親節點的位置上       numbers[i] = numbers[j]       i = j       j = 2*i     else:       break   # 被調整節點放入最終位置   numbers[i] = temp def top_heap_sort(numbers):   length = len(numbers)-1   # 指定第一個進行調整的元素的下標   # 它即該無序序列完全二叉樹的第一個非葉子節點   # 它之前的元素均要進行調整   # cheer up!   first_exchange_element = length//2   #建立初始堆

  for x in range(first_exchange_element):     element_exchange(numbers,first_exchange_element-x,length)   # 將根節點放到最終位置,剩餘無序序列繼續堆排序   # length-1 次迴圈完成堆排序   for y in range(length-1):     temp = numbers[1]     numbers[length-y],numbers[1] = temp,numbers[length-y]       element_exchange(numbers,1,length-y-1) if __name__=='__main__':   L = deque([3,2])   L.appendleft(0)

  top_heap_sort(L)     print([L[x]  for x in range(1,len(L))])