#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
const int maxn=1010;
int heap[maxn];
int sz;
//堆从下标1开始
void deleteNode() //最小堆
{
//,第一个节点删除,最后一个放到第一个位置,之后向下调整
heap[1] = heap[sz--];
int cur = 1, son = 2;
// 存在儿子比父亲小
while(son <= sz && (heap[son] < heap[cur] || heap[son+1] < heap[cur]))
{
if(heap[son] > heap[son+1])
son++;
swap(heap[son],heap[cur]);
//指针下移
cur = son;
son*= 2;
}
}
void insertNode(int t)
{
//添加到最后一个节点,向上调整
heap[++sz] = t;
int cur = sz, p = cur/2;
while(p>=1)
{
//比父亲小的节点
if(heap[cur] < heap[p])
swap(heap[cur],heap[p]);
cur = p;
p = cur/2;
}
}
int main()
{
int n,t;
srand(time(0));
while(cin>>n)
{
sz=0;
for(int i=1;i<=n;i++)
{
t=rand()%1000;
insertNode(t);
//cout<<heap[1]<<endl;
}
for(int i=1;i<=n;i++)
{
if(!n%10)
cout<<endl;
cout<<heap[1]<<" ";
deleteNode();
}
cout<<endl;
}
return 0;
}
Node:最小堆
最新推荐文章于 2021-02-12 10:18:56 发布