#include <bits/stdc++.h>
using namespace std;
//[4,3,5,2,1]
void tiao(vector<int>& v, int node, int leng){
int left,right;
int Min;
while(1){
left=node*2+1; //左节点
right=node*2+2; //右节点
if(left<leng){ //如果有左节点
Min=min(v[node],v[left]); //父节点和左节点取最小值
if(right<leng){ //如果有右节点
Min=min(Min,v[right]); //三个节点取最小值
if(Min==v[right]){ //如果最小值是右节点
swap(v[node],v[right]); //交换父节点和右节点
node=right; //接下来判断右节点是否符合最小堆
}
}
if(Min==v[left]){ //如果最小值是左节点
swap(v[node],v[left]); //交换父节点和左节点
node=left; //接下来判断左节点是否符合最小堆
}
else if(Min==v[node]) //如果最小值是父节点,结束
break;
}
else{ //如果没有左节点
break;
}
}
}
vector<int> create(vector<int>& v){
int leng=v.size();
int last_node=leng/2-1; //最后一个非叶子节点
for(int n=last_node;n>=0;--n){
tiao(v,n,leng); //从右往左,从下往上调整
}
return v;
}
using namespace std;
int main() {
//int a;
//cin >> a;
vector<int> v={3,2,5,1,7,4};
vector<int> ans=create(v);
for(int i:ans){
cout<<i<<" ";
}
}
C++ 最小堆实现
最新推荐文章于 2023-03-15 20:01:02 发布