目錄
1.對乙個數組建最大堆,得到堆頂最大值:
2.對乙個數組建最大堆,得到排好序(從小到大)的陣列:
3.向乙個堆中插入元素:
以最小堆作圖示:
下面**是對最大堆的操作:
4.刪除最大堆的堆頂:
以最小堆作圖示:
下面**是對最大堆的操作:
def sink(self, nums, root):
if 2 * root + 1 < len(nums):
k = 2 * root + 2 if 2 * root + 2 < len(nums) and nums[2 * root + 2] > nums[2 * root + 1] else 2 * root + 1
if nums[root] < nums[k]:
(nums[root], nums[k]) = (nums[k], nums[root])
self.sink(nums, k)
for i in range(len(nums) // 2 - 1, -1, -1):
self.sink(nums, i)
print nums[0]
class solution:
def sink(self,s,root):
if 2*root+1s[2*root+1] else 2*root+1
if s[k] > s[root]:
s[k],s[root] = s[root],s[k]
self.sink(s,k)
def maxheap(self,s):
for i in range(len(s)//2-1,-1,-1):#一定得從下往上來
self.sink(s,i)
return s
def heap_sort(self,s):
last = len(s)-1
self.maxheap(s)#構造最大堆
while last >0:
s[0],s[last] = s[last],s[0]
s[:last] = self.maxheap(s[:last])#因對s的切片進行最大堆排序,一定要把排序結果賦值給s,不然就沒有任何結果
last -= 1
return s
answer = solution()
print(answer.maxheap([1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]))
print(answer.heap_sort([1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]))
堆排序之堆的概念 插入 刪除 建堆
內容會持續更新,有錯誤的地方歡迎指正,謝謝 性質 完全二叉樹 或 近似完全二叉樹 不是滿二叉樹的完全二叉樹 分類 最大堆 父節點的值不小於子節點 最小堆 父節點的值不大於子節點。左右子節點 沒有大小的順序。堆的儲存 一般都用陣列來儲存堆。下標為i的節點的父節點的下標為 i 1 2。根節點的左右子節點...
堆的建立,插入,刪除,排序
堆是一種完全二叉樹,有最小堆和最大堆之分,最小堆是指根節點的值一定小於左子樹和右子樹所有元素的值,最大堆則相反 當你從小到大排序時,可以選擇最小堆反之,則選擇最大堆 1.如何建立乙個最小堆呢 由於堆是乙個完全二叉樹,所以滿足以下關係 我們將元素的順序從0開始排,第i個節點稱之為ki,那麼元素就有k0...
堆建立 插入 刪除和排序
ifndef heap h define heap h include include include include include define maxsize 10 typedef int datatype typedef struct heap heap,pheap 堆的初始化 void h...