// 堆排序.cpp : 定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<iostream>
#include<vector>
#include<time.h>
#include<stdlib.h>
#include<algorithm>
usingnamespace std;
void init(int& i)
{
i= rand()%100+1;
}
void printt(int m)
{
cout<< m<<" ";
}
classHeap
{
private:
vector<int> v;
int s;
public:
Heap();
voidHeap_In(int k);
voidHeap_Out();
void push(int elem);
void pop();
int top();
bool empty();
void print();
};
Heap::Heap()
{
s=0;
}
voidHeap::Heap_In(int k/*这里k的意思是目前堆中元素个数*/)
//这里建立一个m个元素的小根堆,将(v[m - 1] < v[(m >> 1) - 1])中的<改成>就是建一个大根堆。
{
int temp= v[k-1];
while(k>1&&(temp> v[(k>>1)-1]))
{
v[k-1]= v[(k>>1)-1];
k>>=1;
}
v[k-1]= temp;
}
voidHeap::Heap_Out()//将建好的堆弹出顶元素
{
int p;
int k=1;
int temp= v[0];
if(2== s)//只有两个节点的时候,不能试用下面while里面的代码,单独拿出来写一个。
{
if(v[0]< v[1])
swap(v[0], v[1]);
return;
}
while((k<<1)+1<= s)
{
p= k<<1;
p+=(p< s&&(v[p]> v[p-1]));
if((v[p-1]> temp))
{
v[k-1]= v[p-1];
k= p;
}
else
break;
}
v[k-1]= temp;
}
voidHeap::push(int elem)//在堆中放入元素
{
v.push_back(elem);
s++;
Heap_In(s);
}
voidHeap::pop()//弹出元素
{
swap(v[0], v[s-1]);
s--;
Heap_Out();
}
intHeap::top()
{
return v.front();
}
boolHeap::empty()
{
return(s==0)?true:false;
}
voidHeap::print()
{
if(s!=0)
for_each(v.begin(), v.end(), printt);
else
cout<<"Heap is empty!"<< endl;
}
int main()
{
Heap h;
vector<int> vec(10);
srand((int)time(NULL));
for_each(vec.begin(), vec.end(), init);
for(int i=0; i< vec.size(); i++)
{
h.push(vec[i]);
}
h.print();
cout<< endl;
for(int i=0; i< vec.size(); i++)
{
cout<< h.top()<<" ";
h.pop();
}
cout<< endl;
return 0;
}