演算法學習_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))])