堆排序
#include <bits/stdc++.h>
using namespace std;
#define MAX 100010
int nSize;
int Heap[MAX];
void HeapUp(int nPos)
{
int nFather = nPos/2;
while(Heap[nPos] < Heap[nFather] && nFather)
{
swap(Heap[nPos],Heap[nFather]);
nPos = nFather;
nFather /= 2;
}
}
void HeapDown(int nPos)
{
int nLeft = nPos*2;
while(nLeft <= nSize)
{
int nRight = nLeft + 1;
int nMin = (nRight <= nSize && Heap[nLeft] > Heap[nRight])?
nRight : nLeft;
if(Heap[nPos] <= Heap[nMin])
{
break;
}
swap(Heap[nPos],Heap[nMin]);
nPos = nMin;
nLeft = nPos * 2;
}
}
void HeapInit()
{
for(int nPos = 1; nPos <= nSize; nPos++)
{
HeapUp(nPos);
}
}
void HeapCout()
{
while(nSize)
{
cout<<Heap[1]<<" ";
swap(Heap[1],Heap[nSize]);
nSize--;
HeapDown(1);
}
}
int main(int argc, char** argv)
{
cin>>nSize;
for(int i = 1; i <= nSize; i++)
{
cin>>Heap[i];
}
HeapInit();
for(int i = 1; i <= nSize; i++)
{
cout<<Heap[i]<<" ";
}
cout<<endl;
HeapCout();
return 0;
}