最小最大堆

2021-09-30 10:24:32 字數 1779 閱讀 8421

#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(element heap,int *n,element item);//插入

int level(int n);///判斷父結點在小層還是大層

void verify_max(element heap,int i,element item);

void verify_min(element heap,int i,element item);

element delete_min(element heap,int *n);///刪除最小值

int min_child_grandchild(int j,int n);//找到j結點子孫中最小值的位置

void min_max_insert(element heap,int *n,element item)

parent=(*n)/2;

if (!parent)

else switch(level(parent))

else

}}int level(int n)/判斷父結點在小層還是大層

void verify_max(element heap,int i,element item)

else

break;

} heap[i] = item;//找到應該插入的位置

}void verify_min(element heap,int i,element item)

else

break;

}heap[i] = item;找到應該插入的位置

}element delete_min(element heap, int *n)

if(*n == 1) return heap[(*n)--];///case 1 只有乙個數時

element item = heap[(*n)--];//item為最後面的那個值

heap[0].key = heap[1].key;heap[0]為返回值

int k, i, last = (*n)/2, parent;

for(i=1; i<=last; )

parent = k/2;//case 2(c)說明k是i的孫子

if(item.key > heap[parent].key)

i = k;

}heap[i] = item;

return heap[0];//返回最小值}

int min_child_grandchild(int j,int n)///找到j結點子孫中最小值的位置

/*int min_child_grandchild( int i, int n)//找到i結點子孫中最小值的位置

; for(int j=0; k[j]<=n&&j<=4; ++j)

return min;}*/

int main(int argc, char const *ar**)

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

;for (i = 1; i < 8; ++i)

delete_min(heap,&n);

for (i = 1; i < 7; ++i)

return 0;

}

最大堆 最小堆

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

最大堆 最小堆

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

最大堆 最小堆

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