python堆 Python實現堆

2021-10-12 14:58:15 字數 2129 閱讀 4108

堆 (heap) 是一種經過排序的完全二叉樹,其中任一非葉子節點的值均不大於(或不小於)其左孩子和右孩子節點的值。

堆,又被為優先佇列(priority queue)。儘管名為優先佇列,但堆並不是佇列。

其他概念解釋

最大堆 根結點的鍵值是所有堆結點鍵值中最大者。

最小堆 根結點的鍵值是所有堆結點鍵值中最小者。

最小堆最大堆

基本功能介紹及實現

在接下來的內容裡,我們將逐步介紹堆的具體功能是如何實現的。

堆有兩點需要了解,一是堆一般採用完全二叉樹;二是堆中的每乙個節點都大於其左右子節點(大頂堆),或者堆中每乙個節點都小於其左右子節點(小頂堆)。

1. 建立 heap 類

class heap(object):

def __init__(self):

#初始化乙個空堆,使用陣列來在存放堆元素,節省儲存

self.data_list =

2. 新增 get_parent_index 函式

def get_parent_index(self,index):

#返回父節點的下標

if index == 0 or index > len(self.data_list) -1:

return none

else:

return (index -1) >> 1

3. 新增 swap 函式

def swap(self,index_a,index_b):

#交換陣列中的兩個元素

self.data_list[index_a],self.data_list[index_b] = self.data_list[index_b],self.data_list[index_a]

4. 新增 insert 函式

def insert(self,data):

#先把元素放在最後,然後從後往前依次堆化

#這裡以大頂堆為例,如果插入元素比父節點大,則交換,直到最後

index = len(self.data_list) -1

parent = self.get_parent_index(index)

#迴圈,直到該元素成為堆頂,或小於父節點(對於大頂堆)

while parent is not none and self.data_list[parent] < self.data_list[index]:

#交換操作

self.swap(parent,index)

index = parent

parent = self.get_parent_index(parent)

5. 新增 removemax 函式

def removemax(self):

#刪除堆頂元素,然後將最後乙個元素放在堆頂,再從上往下依次堆化

remove_data = self.data_list[0]

self.data_list[0] = self.data_list[-1]

del self.data_list[-1]

#堆化self.heapify(0)

return remove_data

6. 新增 heapify 函式

def heapify(self,index):

#從上往下堆化,從index 開始堆化操作 (大頂堆)

total_index = len(self.data_list) -1

while true:

maxvalue_index = index

if 2*index +1 <= total_index and self.data_list[2*index +1] > self.data_list[maxvalue_index]:

maxvalue_index = 2*index +1

if 2*index +2 <= total_index and self.data_list[2*index +2] > self.data_list[maxvalue_index]:

maxvalue_index = 2*index +2

if maxvalue_index == index:

break

self.swap(index,maxvalue_index)

index = maxvalue_index

堆python 建立堆 python

建立最大 小 堆 二叉堆本質上是一種完全二叉樹,儲存方式並不是鏈式儲存,而是順序儲存 堆操作 插入 葉子節點上調 刪除 堆頂元素下沉 堆建立 非葉子節點下沉 從最後乙個非葉子節點開始 最小堆 最小堆任何乙個父節點的值,都小於等於它左右孩子節點的值 建立過程 如果非葉子節點值大於其子節點,將其下沉 最...

堆排序python實現 堆排 python實現堆排

一 堆 完全二叉樹 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 是不穩定排序 堆排序中的堆有大頂堆 小頂堆兩種。他們都是完全二叉樹 將該堆按照排序放入列表 1.大頂堆 所有的父節點的值都比孩子節點大,葉子節點值最小。roo...

堆儲存 堆排序 python實現

使用堆實現優先佇列 對於總共n個請求 使用普通陣列或者順序陣列 最差情況o n 2 使用堆 o n log n 堆的基本實現 二叉堆 任何乙個子節點都不大於他的父節點 必須是一棵完全二叉樹 用陣列儲存二叉堆 shift up shift down 基礎堆排序 heapsort1 heapify 堆排...