一.堆的概念:
堆邏輯上是一顆完全二叉樹,採用層次遍歷的方式,物理上儲存在陣列中。
滿足任意結點的值都大於其子樹中結點的值,叫大堆,反之叫小堆。
二.下標關係:
1.已知雙親的下標,則:
left=2parent+1;
right=2parent+2;
2.已知孩子下標,則:
parent=(child-1)/2//向下取整
三.向下調整
前提:左右子樹必須已經是乙個堆,才能調整。
過程(以小堆為例):
1.如果index是葉子結點,則調整過程結束。
判斷左孩子下標是否越界
2.判斷left或right誰是最小孩子min。
如果右孩子下標越界min=left
如果都不越界,判斷array[left]和array[right]誰的值小。
3.比較array[index]和array[min]的值,如果array[index]大,則交換。
4.index=min,min作為新的index迴圈下去。
時間複雜度為:o(log2 n)
(小堆)
public static void shiftdown(intarray,int index,int size)
}if(array[index]>array[min])
left=2*index+1;
}}
四.建堆
找到最後乙個有孩子結點的結點,進行向下調整。
時間複雜度為:o(nlog2 n)
public static void creatheap(int array,int size)
}
堆—動態查詢
1.出佇列
2.入佇列
3.隊首元素(當前優先順序最高的元素)
利用堆可以找最值的基本功能,完成其他應用
1.topk
在海量資料中,尋找前k大的資料
找排名前k大的,建k個大小的小堆
堆排序是選擇排序
public
class
heapsort
}private
static
void
createbigheap
(int
array)
}private
static
void
shiftdown
(int
array,
int size,
int i)}if
(array[i]
>=array[max]
;return;}
swap
(array,i,max)
;i=max;}}
private
static
void
swap
(int
array,
int i,
int j)
}
資料結構 堆
最大堆 最小堆 堆的定義是 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 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...
資料結構 堆
堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...