#ifndef HEAP_SORT_H #define HEAP_SORT_H #include<assert.h> template<class T,int n> inline void swap(T* s,int i,int j) { assert((i<n)&&(j<n)); T temp=s[i]; s[i]=s[j]; s[j]=temp; } template<class T,int n> inline int leftChild(int i){ return 2*i+1; } template<class T,int n> inline int rightChild(int i){ return 2*i+2; } template<class T,int n> void build_heap(T* s) { int i=(n-1)/2; for(;i>=0;i--) keep_heap<T,n>(s,i,n); } template<class T,int n> void keep_heap(T* s,int root,int heap_size) { int min; if(s[root]>s[leftChild<T,n>(root)]&&leftChild<T,n>(root)<heap_size-1) min=leftChild<T,n>(root); else min=root; if(s[min]>s[rightChild<T,n>(root)]&&rightChild<T,n>(root)<heap_size-1) min=rightChild<T,n>(root); if(min!=root) { swap<T,n>(s,min,root); keep_heap<T,n>(s,min,heap_size); } } template<class T,int n> void heap_sort(T *s) { build_heap<T,n>(s); int i=n-1; while(i) { swap<T,n>(s,0,i); keep_heap<T,n>(s,0,i+1); i--; } } #endif