演算法時間複雜度
堆:程式執行過程中動態分配的記憶體,比如c中的malloc和c++中的new。這種效率會比較慢,但不用預先定義。
棧:作業系統在建立某個程序或執行緒時,為其建立的記憶體空間,該記憶體空間具有fifo的特性。當程式結束時,只需要修改棧的頭指標就可以直接釋放記憶體了,因此這種效率較快,但需要預先定義。
堆排序的思想:堆是一種資料結構,在這裡我們可以將這個堆看成是一種特殊的完全二叉樹,該二叉樹的特點是其非葉子節點的數必定要大於(或者)小於其子節點上的數。完全二叉樹概念
堆排序就是乙個構建最大堆或最小堆的過程(本例子只講建立最大堆),每次構建乙個最大堆後,將該最大堆的根節點和最右邊的葉子節點進行交換,並脫離堆。然後對剩下的len-1個節點的堆再進行構建最大堆的過程,直到所有的節點都脫離堆之後排序完成。
在模仿堆的資料結構的時候(完全二叉樹),對於節點的編碼利用最直觀的層序遍歷。可以利用一維陣列實現,這種情況下對於起始索引為0的一維陣列來說:
父節點i的左孩子索引為2i+1;
右孩子索引為2i+1+1;
子節點i對應的父節點索引為floor( (i-1)/2 ),表示向下取整。
def
build_max_head
(arr,heapsize,root_index):
#根據給定的根節點計算左右節點的index
left_index = 2*root_index+1
right_index = left_index+1
max_num_index = root_index
#如果左節點大於根節點,那麼max_num_index=left_index
if left_indexand arr[left_index]>arr[max_num_index]:
max_num_index=left_index
#如果右節點大於根節點,那麼max_num_index=right_index
if right_indexand arr[right_index]>arr[max_num_index]:
max_num_index=right_index
if max_num_index != root_index:
arr[root_index],arr[max_num_index] = arr[max_num_index],arr[root_index]
#進行下乙個節點的build_max
build_max_head(arr,heapsize,max_num_index)
defhead_sort
(arr):
#從最後乙個節點開始,對整個堆(完全二叉樹)進行build_max
for i in range((len(arr-1)-1)/2,-1,-1):
build_max_head(arr,len(arr),i)
#對從最後乙個節點開始往前遍歷
for i in range(len(arr)-1, -1, -1):
#這個時候最大值就在根節點
#所以把這個最大值放到有序佇列中
#簡單來說就是把最大值放到最後
arr[i],arr[0] = arr[0],arr[i]
#互換之後,堆中就少了乙個元素,所以當前堆的個數變了,變為i
#此時由於堆只變了根節點,因此只需要對根節點進行build_max
build_max_head(arr,i,0)
if __name__ == '__main__':
arr = [1,3,5,7,9,2,8,0,-1,-2]
output = merge_sort(arr)
print output
資料結構 堆(python實現)
資料結構 堆 python實現 用list來儲存堆元素,表尾端加入元素,首段作為堆頂 借鑑裘老師資料結構與演算法的書加上自己的理解 堆 就是乙個完全二叉樹 class heap object def init self,elist self.elems list elist if elist sel...
python演算法與資料結構(19)堆
堆 一種完全二叉樹,有最大堆和最小堆兩種。最大堆 根總是最大值,最小的值儲存在葉節點中,最小堆 每個非葉子節點的兩個孩子的值都比它大。堆的操作 插入新的值,依然保證堆的最大堆或者最小堆的結構。刪除乙個值。堆的表示 使用陣列表示堆。parent int i 1 2 left 2i 1 right 2i...
資料結構與演算法 堆結構
1 本質 一顆特殊的樹。2 特性 3 分類 對於每乙個節點的值都大於等於子節點的值的情況,該堆被稱為大頂堆。對於每乙個節點的值都小於等於子節點的值的情況,該堆被稱為小頂堆。4 儲存方式 對於完全二叉樹而言,陣列儲存方式是最節省記憶體的。5 插入節點的時間複雜度 將節點插入到靠左的底層作為新的葉子節點...