資料結構 優先佇列(堆)

2021-08-14 20:32:44 字數 2700 閱讀 6331

什麼是堆

堆是一棵具有特定性質的二叉樹

堆的基本要求是堆中所有節點的值必須大於等於(或者小於等於)其孩子節點的值

堆應該是一棵完全二叉樹

堆的表示

由於堆在形式上是一棵完全二叉樹,所以用陣列不會浪費儲存空間

public

class

heap

private

int ary;

private

int size; //堆中元素個數

private

int capacity; //堆的大小

private heaptype heaptype; //堆的型別

/** * 建立堆

*@param heaptype 堆的型別

*@param capacity 堆的大小

*/public

heap(heaptype heaptype)

/***@param i 元素在陣列中的下標

*@return 父元素在陣列中的下標, 返回-1表示不存在雙親

*/private

intparentindex(int i)

return (i - 1) / 2;

}/**

*@param i 元素在陣列中的下標

*@return 左孩子在陣列中的下標, 返回-1表示不存在左孩子

*/private

intlchildindex(int i)

return left;

}/**

*@param i 元素在陣列中的下標

*@return 右孩子在陣列中的下標, 返回-1表示不存在右孩子

*/private

intrchildindex(int i)

return right;

}/**

*@return 獲得堆頂元素

*/public

inttop()

return ary[0];

}/**

* 最大堆堆化(下滲)

*@param i 節點下標

*/private

void

int l, r, max;

int temp;

l = lchildindex(i);

r = rchildindex(i);

if(l != -1 && ary[l] > ary[i])else

if(r != -1 && ary[r] > ary[max])

if(i != max)

}/**

* 最小堆堆化(下滲)

*@param i 節點下標

*/private

void

int l, r, min;

int temp;

l = lchildindex(i);

r = rchildindex(i);

if(l != -1 && ary[l] < ary[i])else

if(r != -1 && ary[r] < ary[min])

if(i != min)

}/**

*@return 刪除並返回堆頂元素

*/public

intremove()

int temp = ary[0];

ary[0] = ary[size--];

switch(heaptype)

return temp;

}/**

*@param i 最大堆指定元素上浮

*/private

void

int temp;

int p =parentindex(i);

if(p != -1 && ary[i] > ary[p])

}/**

*@param i 最小堆指定元素上浮

*/private

void

int temp;

int p =parentindex(i);

if(p != -1 && ary[i] < ary[p])

}//擴容

private

void

resizeheap(int newcapacity)

this.ary = new

int[capacity];

system.arraycopy(old_ary, 0, ary, 0, size);

}/**

* 插入元素

*@param data

*/public

void

add(int data)

++size;

ary[size - 1] = data;

switch(heaptype)

}/**

* 插入陣列

*@param data

*/public

void

add(int data)

for(int i = 0; i < n; i++)

switch(heaptype)

break;

default:

for(int i = parentindex(size - 1); i >= 0; i--)}}

/*** 清空堆

*/public

void

clear()

}

資料結構 堆(優先佇列)

一種樹形資料結構,分大根堆,小根堆。大根堆 max heap 滿足所有父節點不小於其任意子節點。小根堆 min heap 滿足所有父節點不大於其任意子節點。在這裡,我們只考慮二叉堆。二叉堆是一棵完全二叉樹。solution 可見,每堆果子分別被合併了n 1次,n 2次,n 3次 1次 則數量越小的堆...

資料結構 優先佇列(堆)

堆 堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 結構性質 堆總是一棵完全樹。堆序性 堆中某個節點的值總是不大於或不小於其父節點的值 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。堆的意義就在於 最快的找到最大 最小值,在堆結構中插入乙個值重新構造堆結構,取走最...

資料結構 堆 優先佇列

堆,實際上是乙個完全二叉樹,大概就是介個樣子。堆一般又分為大頂堆和小頂堆 實際上差不多。這裡就用小頂堆舉個例好了qwq 其實stl中的優先佇列已經有堆的作用了,但是手寫的堆也有一些自己的優勢。我們先來看看堆的一些常用操作。1.插入乙個數 2.求集合當中的最小值 3.刪除最小值 4.刪除任意乙個元素 ...