c++手写堆
Posted yeah17981
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++手写堆相关的知识,希望对你有一定的参考价值。
无聊尝试一下
#include<bits/stdc++.h>
using namespace std;
void adjustheap(vector<int> &b,int index,int len) //堆的向下调整
//int len = b.size() - 1;//长度
int cur = index;//要交换的元素的当前位置
int left_child = 2 *cur + 1; //左儿子
while(left_child <= len)
if( left_child < len && b[left_child] < b[left_child + 1])
left_child++;
if(b[cur] < b[left_child])
swap(b[cur], b[left_child]);
cur = left_child;
left_child = 2 * cur + 1;
else break;
void upAdjust(vector<int> &b,int index)
//左子节点=2*父节点+1 右子节点=2*父节点+2
int cur=index;
int father=cur/2;
if(cur%2==0) father--;
while (cur>= 1)
// 如果父节点的权值比子节点权值小,则交换元素
if (b[father]<b[cur])
swap(b[father],b[cur]);
cur = father;
father=cur/2;
if(cur%2==0) father--;
else
break;
void makeheap(vector<int> &b,int len)
int index = (len - 2)/2 + 1;//从最后一个非叶子节点开始建堆。
for(int i = index ; i >= 0;i--)
adjustheap(b,i,len);
return ;
vector<int> b;
int main()
int n,a;
cin>>n;
while(n--)
cin>>a;
b.push_back(a);
int len = b.size() - 1;//长度
makeheap(b,len);
int k=5;
for(int i=1;i<=k;i++)//取前k个数
cout<<b[0]<<" ";
swap(b[0],b[len]);
len--;
b.pop_back();
adjustheap(b,0,len);
cin>>n;
while(n--)//插入
cin>>a;
b.push_back(a);
len++;
upAdjust(b,len);
k=len;
for(int i=1;i<=k;i++)//取所有数
cout<<b[0]<<" ";
swap(b[0],b[len]);
len--;
adjustheap(b,0,len);
以上是关于c++手写堆的主要内容,如果未能解决你的问题,请参考以下文章