堆的主要性質
1、堆有兩種:大頂堆和小頂堆,大頂堆是指每個結點的值都大於其左右孩子的值(小頂堆反之)。
2、堆和陣列下標的關係
根結點是從 0 開始儲存,所以假設某個元素為序號為 i ,那麼其左子樹的位置是 2i+1 ,其右子樹的位置是 2i+2 ,其父節點的位置是 (n-1)/2 。
3、堆和樹的關係
堆是完全二叉樹,
完全二叉樹:(1)除最後一層外,每一層上的節點數均達到最大值;(2)最後一層只缺少
若干右邊結點。
4、堆和棧的關係
棧記憶體由作業系統來分配和釋放,堆記憶體由程式設計師自己分配和釋放。
5、堆排序的時間複雜度為o(nlogn)
堆排序
一、構造初始堆
1、初始化堆是對所有非葉子結點進行篩選,篩選只需要從第[n/2](向下取整)個父結點開始,從後往前進行結點的調整。
2、父結點調整
(1)父結點調整的目的是讓父結點以後的分支都滿足大頂堆或小頂堆的性質。
(2)具體步驟
如果父、左兒子和右兒子中,父是最大值,則不需要調整;
如果父不是最大值,則先把父與最大兒的值交換,再遞迴判斷最大兒處結點是否需要調整。
二、堆排序
1、將array[0]與最後乙個元素交換,這樣最後乙個結點就是最大值,然後在 0~n-2 範圍內進行根結點調整;
2、將array[0]與倒數第二個元素交換,再在 0~n-3 範圍內根結點調整;
3、重複以上步驟 array.length-1 次。
demo
public class myheapsort
static void input() }
static void buildmaxheap(int array)
} static void fathernodeadjust(int array, int heapsize, int index)
// 右兒子是否存在,右兒子是否更大。
if (rightarray[largest])
if (index != largest)
} }
常見題目
下列資料結構不是多型資料型別的是()
a 堆 b 棧 c 字串 d 有向圖
下標從1 開始,在含有n個關鍵字的小根堆中,關鍵字最大的記錄有可能儲存在()位置上
a [n/2] b [n/2]-1 c 1 d [n/2]+2
【解析】
小根堆中最大的數一定是放在葉子節點上
堆本身是個完全二叉樹
完全二叉樹的葉子節點的位置大於 n/2
選d
資料結構 堆
最大堆 最小堆 堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點...
資料結構 堆
資料結構 堆的操作和實現 當應用優先順序佇列或者進行堆排序時,一般利用堆來實現。堆是乙個完全 除最底層 外都是滿的 二叉樹,並滿足如下條件 1 根結點若有子樹,則子樹一定也是堆。2 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...
資料結構 堆
堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...