假设为升序, 构建大堆
每次交换第一个和最后一个元素, 使最大元素沉底, 再对剩下元素进行建大堆
.h:
#include <vector> //利用vector容器实现堆
template<class T>
class HeapSort
{
public:
HeapSort( ) //默认构造函数
{}
HeapSort( T* a, size_t n ) //构建堆 //假设需要升排列 ,我们构建大堆, 每次将最大的元素与最后一个元素交换后, 最大的就在后面, 将这个元素,最大元素忽视(假设数组里已经没有这个元素)再建堆, 重复之前操作, 完成升序
{
_a.reserve( n );
for ( size_t i = 0; i < n; ++i ) //先构建一颗树
{
_a.push_back( a[i] );
}
AdjustDown( _a.size( ) ); //用向下调整算法构建大堆
Sort( ); //排序
//for ( size_t k = _a.size( ); k > 2; --k )//只有一个元素时就不需要排序了
//{
// swap( _a[0], _a[k - 1] );
// for ( int y = (k - 3) / 2; y >= 0; --y )//此时当堆里面只有 k-1 个元素
// {
// AdjustDown( y, k - 1 ); //必须自己传此时堆元素个数, 不能用_a.size( )否则程序会出错
// }
//}
//if ( _a[0] < _a[1] )
//{
// swap( _a[