//
// main.cpp
// Data Structure TRY1
//
// Created by zr9558 on 6/7/13.
// Copyright (c) 2013 zr9558. All rights reserved.
//
// Data Structure C++, Weiss, P.273 Heapsort
#include<iostream>
using namespace std;
#include<vector>
#include<math.h>
inline int leftChild( int i) // the right child of i is 2*i+2
{
return 2*i+1;
}
template<typename Comparable>
void percDown( vector<Comparable> &a, int i, int n)
{
int child;
Comparable temp;
for( temp=a[i]; leftChild(i)<n; i=child)
{
child=leftChild(i);
if( child!=n-1 && a[child]<a[child+1])
child++;
if( temp<a[child])
a[i]=a[child];
else break;
}
a[i]=temp;
}
template<typename Comparable>
void heapSort( vector<Comparable> &a)
{
for( int i=int(a.size())/2; i>=0; --i) // buildHeap
percDown(a, i, int(a.size()));
for( int j=int(a.size())-1; j>0; --j) // deleteMax
{
swap(a[0],a[j]);
percDown(a, 0, j);
}
}
int main()
{
vector<int> ivec;
for( int i=0; i<30; ++i)
ivec.push_back(rand()%100);
for( int i=0; i!=ivec.size(); ++i)
cout<<ivec[i]<<" ";
cout<<endl;
heapSort(ivec);
for( int i=0; i!=ivec.size(); ++i)
cout<<ivec[i]<<" ";
cout<<endl;
return 0;
}