//file :HEAPSORT.h #ifndef _HEAPSORT_H_HUMING_INCLUDE_ #define _HEAPSORT_H_HUMING_INCLUDE_ #include<iostream> #define maxlen 10000 using namespace std; template <class T> class array_BTtree { public: void setup(T a[],int n); void order(); void swap(int i,int j); int size(); void heapsort(); T see(int i); void pushdown(int first,int last); private : T data[maxlen]; int MAX; }; template <class T> void array_BTtree<T>::heapsort() { int i; for(i=size()/2; i>=1; i--) pushdown(i,size()); // 整理堆,把最大的压在下面,小的不断向上 for(i=size(); i>=2; i--) { swap(1,i); pushdown(1,i-1); }//最小的在最上面,然后和最后一个交换就可以得到一个降序的序列 } template<class T> void array_BTtree<T>::pushdown(int first,int last) { int r=first; while(r<=last/2) { if(last/2==r&&last%2==0)//只有左儿子 { if(see(r)>see(2*r)) swap(r,2*r); r=last; } else if(see(r)>see(2*r)&&see(2*r)<=see(2*r+1)) { swap(r,2*r); r*=2; } else if(see(r)>see(2*r)&&see(2*r+1)<see(2*r)) { swap(r,2*r+1); r=2*r+1; } // 根节点与其中较小者交换(若、右儿子相等,则与其左儿子交换) else r=last; } } template <class T> void array_BTtree<T>::swap(int i,int j) { T temp; temp=data[i]; data[i]=data[j]; data[j]=temp; } template <class T> void array_BTtree<T>::setup(T a[],int n) { for(int i=1; i<=n; i++) data[i]=a[i]; MAX=n; } template <class T> void array_BTtree<T>::order() { for(int i=1; i<=MAX; i++) cout << data[i]<< " "; } template <class T> int array_BTtree<T>::size() { return MAX; } template<class T> T array_BTtree<T>::see(int i) { return data[i]; } #endif
//main.cpp #include "heapsort.h" int main() { array_BTtree<int> t; int i,n,a[maxlen]; cin >> n; for(i=1; i<=n; i++) cin >> a[i]; t.setup(a,n); t.heapsort(); t.order(); return 0; }