面試前必看 堆排序 堆插入 堆刪除

2021-10-01 17:31:24 字數 1355 閱讀 8786

目錄

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...