資料結構演算法 Python實現堆排序

2021-08-23 12:21:58 字數 1918 閱讀 1285

演算法時間複雜度

堆:程式執行過程中動態分配的記憶體,比如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 插入節點的時間複雜度 將節點插入到靠左的底層作為新的葉子節點...