赞
踩
- //最大二叉堆实际上就是一个顺序数组,这个数组遵循这样的规律:若将数组按顺序写成二叉树的形式,则除根节点外,树中节点不大于其父节点
-
- #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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。