保證父節點優先順序始終高於子節點。
插入:判斷父子節點的優先順序
刪除:查詢:直接返回根節點的值
tip:根節點下標從1開始
#include #define max 1000000
using namespace std;
int heap[max + 10] = ;
int n, cnt=0; // cnt為堆中元素個數;
short op;
// 自下而上維護堆
void buttomup(int pos)
}// 自上而下維護堆
void updown(int pos)
// 右節點優先順序小於父,返回
else return;
} // 左節點的優先順序高於右節點
else
// 左節點優先順序小於父節點,返回
else return;
} }// 只有左節點
else if (2 * pos <= cnt)
// 左節點優先順序小於父節點,返回
else return;
} // 沒有節點,結束
else
}int main()
else if (op == 2)
else if (op == 3)
} }}
void swap(int a, int b)
void add(int k)
else return;
}}
void del()
else return;
} else
else return;
} }}
void get()
手寫堆費時易錯,可利用在c++的stl中的優先佇列。
#include
// 大根堆
priority_queueq_name;
// 小根堆
priority_queue,greater> q_name;
q.top() //取得堆頂元素,並不會彈出
q.pop() //彈出堆頂元素
q.push() //往堆裡面插入乙個元素
q.empty() //查詢堆是否為空,為空則返回1否則返回0
q.size() //查詢堆內元素數量
給定乙個數列,初始為空,請支援下面三種操作:優化了io,將遞迴改為迴圈,使用了位運算(537ms / 3.16mb / 1.08kb)給定乙個整數 xx,請將 xx 加入到數列中。
輸出數列中最小的數。
刪除數列中最小的數(如果有多個數最小,只刪除 11 個)。
第一行是乙個整數,表示操作的次數 nn。
接下來 nn 行,每行表示一次操作。每行首先有乙個整數 opo**p 表示操作型別。
對於每個操作 22,輸出一行乙個整數表示答案。
輸入 #1複製
輸出 #1複製5
1 21 523
2
2
5
#include #define max 1000000
int heap[max + 10] = ;
int n, cnt=0;
int op;
void swap(int a, int b)
void add(int k)
else return; }}
void del()
else return;
} else
else return;
} }}int main()
else if (op == 2)
else if (op == 3)
} return 0;
}
利用stl( 2.14s / 2.64mb / 452b )
#include #include using namespace std;
int n, op;
priority_queue,greater> q;
int main() else if (op == 2)else if (op == 3)
}return 0;
}
資料結構與演算法 二叉堆
核心操作是sift up,和sift down,其他所有操作都是建立在這兩個核心操作的基礎上的,事實上所有的堆結構都可以使用這兩個操作。const int maxsize 10001 int size 0 int min heap maxsize 0號單元不使用,因為如果使用0單元,則k 2無法找到...
資料結構與演算法 二叉堆
二叉堆本質上是一種完全的二叉樹,它分為兩個型別。1.最大堆 2.最小堆 什麼是最大堆?最大堆的任何乙個父節點的值,都大於或等於它左 右孩子節點的值。什麼是最小堆?最小堆的任何乙個父節點的值,都小於或等於它左 右孩子節點的值。二叉堆的根節點叫做堆頂。最大堆和最小堆的特點決定了 最大堆的堆頂是整個堆中的...
資料結構 二叉堆
二叉堆一般用來實現優先佇列 優先佇列是一種至少允許以下兩種操作的資料結構 insert 以及 deletemin 同查詢樹一樣,二叉堆具有結構性與堆序性,對二叉堆的基本操作可能會破壞這些性質,所以二叉堆的操作要直到其基本性質滿足才能結束。一 結構性 二叉堆在結構上為完全二叉樹,其具有完全二叉樹的結構...