大頂堆的python實現
堆的python實現
class Heap(object):
"""大頂堆的定義,實現插入和刪除"""
def __init__(self, capacity):
self.a = [None] * (capacity + 1)
self.n = capacity
self.count = 0
def insert(self, data):
"""插入一個資料"""
if self.count >= self.n:
return False
self.count += 1
i = self.count
self.a[i] = data
# 讓新插入的節點與父節點對比大小。如果不滿足子節點小於等於父節點的大小關係,
# 我們就互換兩個節點。一直重複這個過程,直到所有的子節點小於等於父節點。
while int(i / 2) > 0 and self.a[i] > self.a[int(i / 2)]:
temp = self.a[i]
self.a[i] = self.a[int(i / 2)]
self.a[int(i / 2)] = temp
i = int(i / 2)
print(self.a)
return True
def remove_max(self):
"""刪除大頂堆最大值"""
if self.count == 0:
return False
self.a[1] = self.a[self.count]
self.count -= 1
self.heapify()
print(self.a)
return True
def heapify(self):
# 刪除堆頂元素之後,就需要把第二大的元素放到堆頂,那第二大元素肯定會出現在左右子節點中。
# 然後我們再迭代地刪除第二大節點,以此類推,直到葉子節點被刪除。
i = 1
while True:
max_pos = i
if 2 * i <= self.count and self.a[i] < self.a[2 * i]:
max_pos = 2 * i
if 2 * i + 1 <= self.count and self.a[max_pos] < self.a[2 * i + 1]:
max_pos = 2 * i + 1
if max_pos == i:
self.a[self.count + 1] = None
break
temp = self.a[i]
self.a[i] = self.a[max_pos]
self.a[max_pos] = temp
i = max_pos
def build_heap(self, arr):
"""演算法從第1個下標開始計算,所以需要插入站位None"""
n = len(arr)
arr.insert(0, None)
# 我們只對 n/2 開始到 1的資料進行堆化,下標是n/2+ 1 到 n 的節點都是葉子節點,不需要堆化,
# 對於完全二叉樹來說,下標是n/2+ 1 到 n 的節點都是葉子節點
for i in range(int(n / 2), 0, -1):
self.heapify_by_arr(arr, n, i)
return arr
@staticmethod
def heapify_by_arr(arr, l, i):
while True:
max_pos = i
if 2 * i <= l and arr[i] < arr[2 * i]:
max_pos = 2 * i
if 2 * i + 1 <= l and arr[max_pos] < arr[2 * i + 1]:
max_pos = 2 * i + 1
if max_pos == i:
break
temp = arr[i]
arr[i] = arr[max_pos]
arr[max_pos] = temp
i = max_pos
def sort_by_heap(self, arr):
"""利用堆進行陣列排序"""
k = len(arr)
arr = self.build_heap(arr)
while k > 1:
temp = arr[k]
arr[k] = arr[1]
arr[1] = temp
k -= 1
self.heapify_by_arr(arr, k, 1)
print(arr)
相關文章
- 堆和索引堆的python實現索引Python
- 《排序演算法》——堆排序(大頂堆,小頂堆,Java)排序演算法Java
- 圖解大頂堆的構建、排序過程圖解排序
- 堆的實現
- Python實現堆疊與佇列Python佇列
- 小頂堆與topK的具體程式碼實現《演算法很美》TopK演算法
- 普通對頂堆
- 堆的原理與實現
- Python資料結構——二叉堆的實現Python資料結構
- Python實現堆疊和佇列詳解Python佇列
- 圖的深度優先遍歷(堆疊實現和非堆疊實現)
- PHP 實現堆, 堆排序以及索引堆PHP排序索引
- 堆的原理以及實現O(lgn)
- 【練習】串的堆分配實現
- 串的堆分配表示與實現
- 【筆記】堆及其實現筆記
- 圖的深度優先遍歷[非堆疊、堆疊實現]
- 堆的定義、特點及實現
- php實現一個簡單的堆PHP
- 左傾堆以及Java實現Java
- 實現web置頂效果Web
- 大根堆和堆排序的原理與實現排序
- 4.16 實現自己的堆管理器
- 堆疊的實現(1)--靜態陣列陣列
- Rust 中的Box型別實現堆分配Rust型別
- 基於"堆"的底層實現和應用
- 優先佇列的一種實現方式—堆佇列
- js返回頁面頂部的實現(layui)JSUI
- 10.鞏固學習PriorityQueue類------海量資料處理的 Top K演算法(問題) 小頂堆實現演算法
- Vue開發——實現吸頂效果Vue
- js實現點選回到頂部JS
- vue中實現回到頂部功能Vue
- java使用PriorityQueue即優先佇列實現大根堆和小根堆Java佇列
- 原生JavaScript實現頁面回到頂部的功能JavaScript
- 實現列表懸浮標籤「頂上去」的效果
- 安卓當下最流行的吸頂效果的實現安卓
- 八大排序演算法的 Python 實現排序演算法Python
- 八大排序演算法的python實現排序演算法Python