- #include<iostream>
- #include<string>
- using namespace std;
- static size_t heap_size=0;
- inline size_t left(size_t i)
- {
- return 2*i;
- }
- inline size_t right(size_t i)
- {
- return 2*i+1;
- }
- inline size_t parent(size_t i){return i>>1;}
- template<class Type>
- void max_heap(Type A[],size_t pos)
- {
- size_t largest=pos;
- Type temp;
- size_t l=left(pos) ,r=right(pos);
- if(l<=heap_size)
- {
- if(A[l]>A[pos])
- largest=l;
- /*else
- largest=pos;*/
- }
- if(r<=heap_size&&A[r]>A[largest])
- largest=r;
- if(largest!=pos)
- {
- temp=A[largest];
- A[largest]=A[pos];
- A[pos]=temp;
- //cout<<"A["<<pos<<"]="<<A[pos]<<endl;
- max_heap(A,largest);
- }
- }
- template<class Type>
- void build_heap(Type A[],size_t A_size)
- {
- heap_size=A_size;
- for(size_t i=A_size/2;i>=1;--i)
- {
- max_heap<Type>(A,i);
- }
- }
- template<class Type>
- void heap_sort(Type A[],size_t A_size)
- {
- Type temp;
- build_heap<Type>(A,A_size);
- /* for(int i=1;i!=10;++i)
- cout<<A[i]<<" ";*/
- for(size_t i=A_size;i>=1;--i )
- {
- temp=A[1];
- A[1]=A[i];
- A[i]=temp;
- --heap_size;
- max_heap<Type>(A,1);
- }
- }
- int main()
- {
- int A[]={5,54,8,64,23,64,56,24,12,46};
- heap_sort<int>(A,9);
- for(int i=1;i!=10;++i)
- cout<<A[i]<<endl;
- return 0;
- }