每日N題 大根堆 小根堆

2021-06-09 22:12:56 字數 1018 閱讀 2212

很久很久以前,2023年計算機先驅獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德(robert w.floyd)和威廉士(j.williams)在2023年共同發明了著名的堆排序演算法( heap sort )。

n個關鍵字序列kl,k2,…,kn稱為大根堆,當且僅當該序列滿足如下性質:(1)ki>=k(2i)且ki>=k(2i+1)(1≤i≤ n),(即父親大約兒子)

1)將初始待排序關鍵字序列(r1,r2....rn)構建成大頂堆,此堆為初始的無序區;

2)將堆頂元素r[1]與最後乙個元素r[n]交換,此時得到新的無序區(r1,r2,......rn-1)和新的有序區(rn),且滿足r[1,2...n-1]<=r[n]; 

3)由於交換後新的堆頂r[1]可能違反堆的性質,因此需要對當前無序區(r1,r2,......rn-1)調整為新堆,然後再次將r[1]與無序區最後乙個元素交換,得到新的無序區(r1,r2....rn-2)和新的有序區(rn-1,rn)。不斷重複此過程直到有序區的元素個數為n-1,則整個排序過程完成。

堆排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,它們均是通過呼叫heapify實現的。  

堆排序的最壞時間複雜度為o(nlogn)。堆序的平均效能較接近於最壞效能。  

由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。  

堆排序是就地排序,輔助空間為o(1)。   

它是不穩定的排序方法。

1.海量整數中選取最大的n個;

答:只需建乙個具有n個節點的大根堆即可,不停地往裡插入節點。

2.設計乙個資料結構,其中包含兩個函式,1.插入乙個數字,2.獲得中數。並估計時間複雜度。

答:使用大根堆和小根堆儲存。

使用大根堆儲存較小的一半數字,使用小根堆儲存較大的一半數字。

插入數字時,在o(logn)時間內將該數字插入到對應的堆當中,並適當移動根節點以保持兩個堆數字相等(或相差1)。

獲取中數時,在o(1)時間內找到中數。

引文:

堆(大根堆 小根堆)

堆又可稱之為完全二叉堆。這是乙個邏輯上基於完全二叉樹 物理上一般基於線性資料結構 如陣列 向量 鍊錶等 的一種資料結構。學習過完全二叉樹的同學們都應該了解,完全二叉樹在物理上可以用線性資料結構進行表示 或者儲存 例如陣列int a 5 就可以用來描述乙個擁有5個結點的完全二叉樹。那麼基於完全二叉樹的...

堆(Heap)大根堆 小根堆

具有以下的特點 1 完全二叉樹 2 heap中儲存的值是偏序 min heap 父節點的值小於或等於子節點的值 max heap 父節點的值大於或等於子節點的值 一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為...

堆(Heap)大根堆 小根堆

目錄一般都用陣列來表示堆,i結點的父結點下標就為 i 1 2。它的左右子結點下標分別為2 i 1和2 i 2。如第0個結點左右子結點下標分別為1和2。插入乙個元素 新元素被加入到heap的末尾,然後更新樹以恢復堆的次序。每次插入都是將新資料放在陣列最後。可以發現從這個新資料的父結點到根結點必然為乙個...