//最大二叉堆实际上就是一个顺序数组,这个数组遵循这样的规律:若将数组按顺序写成二叉树的形式,则除根节点外,树中节点不大于其父节点 #include "stdafx.h" //二叉堆的建立 //先将输入序列排序成二叉堆的形式 template<class T> void max_heapify(vector<T>& vec,int i,int heap_size) { int l=2*i; int r=2*i+1; int largest; if(l<=heap_size-1&&vec[l]>vec[i]) largest=l; else largest=i; if(r<=heap_size-1&&vec[r]>vec[largest]) largest=r; if(largest!=i) { swap(vec[i],vec[largest]); max_heapify(vec,largest,heap_size); } } template<class T> void build_max_heap(vector<T>& vec) { int heap_size=vec.size(); for(int i=vec.size()/2-1;i>=0;--i) { max_heapify(vec,i,heap_size); } } template<class T> void heap_sort(vector<T>& vec) { int heap_size=vec.size(); build_max_heap(vec); for(int i=vec.size()-1;i>=1;--i) { swap(vec[i],vec[0]); --heap_size; max_heapify(vec,0,heap_size); } } int main() { vector<int> ivec; for(int i=0;i<10;++i) { int n=rand()%10; ivec.push_back(n); } cout<<"before sort"<<endl; for(vector<int>::iterator iter=begin(ivec);iter!=end(ivec);++iter) { cout<<*iter<<" "; } cout<<endl; build_max_heap(ivec); cout<<"after heapify"<<endl; for(vector<int>::iterator iter=begin(ivec);iter!=end(ivec);++iter) { cout<<*iter<<" "; } cout<<endl; heap_sort(ivec); cout<<"after heap_sort"<<endl; for(vector<int>::iterator iter=begin(ivec);iter!=end(ivec);++iter) { cout<<*iter<<" "; } cout<<endl; }
最大二叉堆的建立以及最大堆排序
最新推荐文章于 2022-07-07 18:28:15 发布