#define leftChild(i) (2*(i)+1) template <typename T> void PercDown(T* A,int i,int n) { int child; T tmp; for (tmp = A[i];leftChild(i) < n;i = child) { child = leftChild(i); if (child != n-1 && A[child + 1] > A[child]) child++; if (tmp < A[child] tmp = A[child]; else break; } A[i] = tmp; } template <typename T> void swap(T& a,T& b) { T tmp; tmp = a; a = b; b = tmp; } template <typename T> void Heapsort(T* A,int n) { int i = 0; for (i = (n-1)/2;i >= 0;i--) { PercDown(A,i); } for (i = n-1;i > 0;i--) { swap(A[0],A[i]); PercDown(A,0,i); } } 时间复杂度为O(n*log(n))