資料結構 堆

2021-09-27 08:12:15 字數 1654 閱讀 8626

一.堆的概念:

堆邏輯上是一顆完全二叉樹,採用層次遍歷的方式,物理上儲存在陣列中。

滿足任意結點的值都大於其子樹中結點的值,叫大堆,反之叫小堆。

二.下標關係:

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 根結點一定大於 或小於 子結點。因為要求堆必須是完全二叉樹,所以可以用線性的資料結構,比如陣列,來實現堆。利用陣列實現...

資料結構 堆

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高 最低 的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱 最大 最小 堆是一棵每乙個節點的鍵值都不小於 大於 其孩子 如果存在 的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是...