最大堆學習筆記

2021-10-09 15:29:38 字數 1558 閱讀 4749

最大堆

優先佇列:特殊的「佇列」,取出元素的順序是依照元素的優先權(關鍵字)大小,而不是元素進入佇列的順序。 優先佇列的實現方法:採用陣列、鍊錶、二叉樹

陣列:插入——元素總是插入尾部 o(1)

刪除——查詢最大或最小的關鍵字 o(n)

從陣列中刪去需要移動元素 o(n)

鍊錶:插入——元素總是插入鍊錶的頭部 o(1)

刪除——查詢最大(最小)關鍵字 o(n)

刪除節點 o(1)

有序陣列:

插入——找到合適的位置 o(n)或者o(logn)

移動元素並插入 o(n)

刪除——刪除最後乙個元素 o(1)

有序鍊錶

插入——找到合適的位置 o(n)或者o(logn)

移動元素並插入 o(1)

刪除——刪除尾元素或首元素 o(1)

堆結構性:用陣列表示的完全二叉樹

有序性:任意節點的關鍵字是其子樹所有節點的最大(最小)值

1.最大堆的建立

typedef struct heapstruct *maxheap;

struct heapstruct;

//建立容量為maxsize的空的堆

maxheap create(int maxsize)

2.插入:將新增的結點插入其父節點從下往上到根節點的有序序列中

bool isfull(maxheap h)

bool insert(maxheap h, elementtype item)

i = ++h->size; //size+1;

for(;h->elements[i/2]elements[i] = h->elements[i/2];

}h->elements[i] = item;

return true;

}

3.刪除最大值

bool isempty(maxheap h)

elementtpye delete(maxheap h)

if(x > h->elements[child]) break;

else

}h->elements[parent] = x;

return maxiten;

}4.最大堆的建立

如何將已經存在的n個元素按最大堆的要求存放在乙個陣列中。

方案一:利用最大堆的插入操作將n個元素相續插入到乙個初始為空的堆裡,o(nlogn).

方案二:將n個元素按輸入順序存入二叉樹,需要滿足完全二叉樹的結構特徵,但不需要管有序性;

調整各節點元素,以滿足最大堆的有序特徵(刪除結點思想)。

void percdow(maxheap h, int p)

if(x > h->elements[child]) break;

else

}h->elements[parent] = x;

}void buildheap(maxheap h)

}

最小最大堆

include include include include define max size 100 define swap x,y,t t x x y y t typedef struct element element heap max size void min max insert ele...

最大堆 最小堆

堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。最大堆和最小堆是 二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最...

最大堆 最小堆

堆的定義是 n個元素的序列,當且僅當滿足如下關係時被成為堆 1 ki k2i 且 ki k2i 1 或 2 ki k2i 且 ki k2i 1 i 1,2,n 2 當滿足 1 時,為最小堆,當滿足 2 時,為最大堆。若將此序列對應的一維陣列堪稱是乙個完全二叉樹,則2i和2i 1個節點分別是節點i的左...