65,186
社区成员




#include<iostream>
#include<vector>
#include<list>
using namespace std;
//以下三个函数返回i节点的父节点 左孩子 右孩子节点位置
int Parent(int i)
{
if(i%2==0)
return i/2-1;
else
return i/2;
}
int Left(int i)
{
return 2*i+1;
}
int Right(int i)
{
return 2*i+2;
}
void swap(int &a,int &b)
{
int temp;
temp=a;a=b;b=temp;
}
//以i节点为父节点的树为最大堆
void Max_Heapify(vector<int> &a,int i)
{
int l=Left(i),r=Right(i),largest;
if(l<a.size()&&a.at(l)>a.at(i))
largest=l;
else
largest=i;
if(r<a.size()&&a.at(r)>a.at(largest))
largest=l;
if(largest!=i)
swap(a.at(i),a.at(largest));
Max_Heapify(a,largest); //递归子树,使子树为最大堆
}
//由数组a构造最大堆
void Build_Max_Heap(vector<int> &a)
{
int n=a.size();
for(int i=n/2-1;i>=0;--i)
Max_Heapify(a,i); //遍历每个节点 使每个节点的子树都成为最大堆
}
//堆排序
void Heap_Sort(vector<int> &a,list<int> &result)
{
Build_Max_Heap(a);
for(int i=a.size()-1;i>=0;--i)
{
swap(a.at(0),a.at(i)); //a[0]是该堆中的最大元素,与最后一个元素交换,然后压入结果数组result
result.push_front(a.at(i));
a.erase(a.end()-1); //使最后一个元素脱离堆
Max_Heapify(a,0);//保持最大堆
}
}
int main()
{
int a[10]={4,1,3,2,16,9,10,14,8,7};
vector<int> ivec(a,a+9);
list<int> ilst;
Heap_Sort(ivec,ilst);
for(list<int>::iterator iter=ilst.begin();iter!=ilst.end();++iter)
cout<<*iter<<" ";
cout<<endl;
return 0;
}