#include <iostream>
using namespace std;
template <class T>
class minPQ
{
public:
minPQ();
~minPQ();
bool empty();
int getsize();
T top();
void pop();
void push1(const T &);
private:
T* heap; //数组
int Hsize; //数组的容量
int heapsize; //元素个数
};
//构造
template <class T>
minPQ<T>::minPQ()
{
heap = new T[100];
Hsize = 100;
heapsize = 0;
}
//析构
template <class T>
minPQ<T>::~minPQ()
{
delete[] heap;
}
//是否为空
template <class T>
bool minPQ<T>::empty()
{
return heapsize == 0;
}
//顶部元素
template <class T>
T minPQ<T>::top()
{
if (heapsize == 0)
{
return 0;
}
else
return heap[1];
}
//数组加倍
template <class T>
void changelength(T*& a, int oldl, int newl)
{
if (newl < 0)
{
return;
}
T* temp = new T[newl];
if (oldl >= newl)
return;
int num = newl;
copy(a, a + num, temp);
delete[] a;
a = temp;
}
//删除头
template <class T>
void minPQ<T>::pop()
{
if (heapsize == 0)
{
return;
}
else
{
heap[1] = heap[heapsize];
// cout << "把堆尾给堆顶" << endl;
}
heapsize = heapsize - 1;
//cout << "堆的大小缩小到" << heapsize << endl;
T lastE = heap[heapsize+1];
//cout << "把堆尾" << heap[heapsize+1] << "给lastE" << endl;
int currentNode = 1;
int child = 2;
while (child <= heapsize)
{
if (child < heapsize && heap[child] > heap[child + 1])
{
child++;
// cout << "塞到右子树" << endl;
}
if (lastE <= heap[child])
{
// cout << "都满足则退出了" << endl;
break;
}
heap[currentNode] = heap[child];
heap[child] = lastE;
//cout << "交换了" << currentNode << "和" << child << endl;
currentNode = child;
child *= 2;
}
}
//插入
template <class T>
void minPQ<T>::push1(const T & theE)
{
if (heapsize == Hsize-1)
{
changelength(heap, Hsize, 2 * Hsize);
Hsize *= 2;
}
//
heapsize = heapsize + 1;
heap[heapsize] = theE;
//cout << "把元素" << theE << "插入到 " << heapsize << " 中" << endl;
int currentNode = heapsize;
while (currentNode != 1 && heap[currentNode / 2] > theE)
{
// cout << "满足循环条件" << endl;
heap[currentNode] = heap[currentNode/2];
heap[currentNode / 2] = theE;
// cout << "交换" << currentNode << "和" << currentNode / 2 << endl;
currentNode = currentNode / 2;
}
}
int main()
{
int n;
cin >> n;
long long *a = new long long[n];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
//初始化
minPQ<long long> m;
for (int i = 0; i < n; i++)
{
m.push1(a[i]);
}
cout << m.top() << endl;
cin >> n; //操作数
int cho; //操作
for (int i = 0; i < n; i++)
{
cin >> cho;
switch (cho) {
case 1: {
long long num;
cin >> num;
m.push1(num);
cout << m.top() << endl;
break;
}
case 2: {
m.pop();
cout << m.top() << endl;
break;
}
case 3: {
int nn;
cin >> nn;
long long aa;
minPQ<long long> mm;
for (int i = 0; i < nn; i++)
{
cin >> aa;
mm.push1(aa);
}
for (int i = 0; i < nn; i++)
{
cout << mm.top() << " ";
mm.pop();
}
}
}
}
}
创建 最小堆类。最小堆的存储结构使用 数组。提供操作:插入、删除、初始化。题目第一个操作是建堆操作,接下来是对堆的插入和删除操作,插入和删除都在建好的堆上操作。
格式
输入
第一行一个数n(n<=5000),代表堆的大小。第二行n个数,代表堆的各个元素。
第三行一个数m (m<=1000),代表接下来共m个操作。接下来m行,分别代表各个操作。下面是各个操作的格式:
插入操作:1 num
删除操作:2
排序操作:第一行两个数3和n,3代表是排序操作,n代表待排序的数的数目,接下来一行n个数是待排序数
保证排序操作只出现一次且一定是最后一个操作。
输出
第一行建堆操作输出建好堆后堆顶的元素。
接下来m个操作,若是插入和删除操作,每行输出执行操作后堆顶的元素的值;若是排序操作,输出一行按升序排序好的结果,每个元素间用空格分隔。