#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; class CompareObj { public: CompareObj( int _a = 0):m_a(_a){} int m_a; }; void g_swap( CompareObj** PtrA, CompareObj** PtrB) { CompareObj *pTemp = *PtrA; *PtrA = *PtrB; *PtrB = pTemp; } void Adjust_BigRoot( CompareObj*psz[], int pos, int length ) { if ( psz == NULL) { return; } int lSon = pos*2; int rSon = pos*2+1; if ( rSon <= length ) { int imax = lSon; if ( psz[rSon]->m_a > psz[lSon]->m_a ) { imax = rSon; } if( psz[imax]->m_a > psz[pos]->m_a) { g_swap( &psz[imax], &psz[pos] ); Adjust_BigRoot( psz, imax, length ); } } else if( lSon <= length && psz[lSon]->m_a > psz[pos]->m_a ) { g_swap( &psz[lSon], &psz[pos] ); Adjust_BigRoot( psz, lSon, length ); } } void Adjust_SmallRoot( CompareObj*psz[], int pos, int length ) { if ( psz == NULL) { return; } int lSon = pos*2; int rSon = pos*2+1; if ( rSon <= length ) { int imin = lSon; if ( psz[rSon]->m_a < psz[lSon]->m_a ) { imin = rSon; } if( psz[imin]->m_a < psz[pos]->m_a) { g_swap( &psz[imin], &psz[pos] ); Adjust_SmallRoot( psz, imin, length ); } } else if( lSon <= length && psz[lSon]->m_a < psz[pos]->m_a ) { g_swap( &psz[lSon], &psz[pos] ); Adjust_SmallRoot( psz, lSon, length ); } } void HeapSort( CompareObj* psz[], int num, bool bAsc ) { if ( psz == NULL || num <=1) { return; } for ( int i= num/2; i>0; i-- ) { if ( bAsc) { Adjust_BigRoot( psz, i ,num ); } else { Adjust_SmallRoot( psz, i ,num ); } } while( num >= 1) { g_swap(&psz[1], &psz[num]); num--; if ( bAsc ) { Adjust_BigRoot( psz, 1, num ); } else { Adjust_SmallRoot( psz, 1, num ); } } } int main() { CompareObj *sz[11]; srand( (unsigned)time( NULL ) ); for ( int i=1; i<11; i++) { int var = rand()%100; sz[i] = new CompareObj(var); cout << var <<" "; } cout <<endl; HeapSort( sz, 10 , true); for ( int i=1; i<11; i++) { cout << sz[i]->m_a <<" "; } cout <<endl; return 0; }