堆数据结构是一种数组对象,它可以被视为一棵完全二叉树。表示堆的数组A是一个两个属性的对象:length[A]是数组中的元素个数,heap-size[A]是存放在A中的堆的元素个数,heap-size[A]<=length[A]。树的根为A[1],给定了某个节点的下标i,其父结点Parent(i)、左儿子Left(i)和右儿子Right(i)的下标可以简单的计算出来:
Parent(i)
return⌊i/2⌋
Left( i )
return 2i
Right( i )
return 2i+1
代码如下:
#include <iostream>
#include <math.h>
static int length;
static int Heap_Size;
inline int Left( int &i )
{
return 2*i;
}
inline int Right( int &i )
{
return 2*i+1;
}
inline int Parent( int &i )
{
return floor(i/2);
}
void Max_Heapify( int *A, int i )
{
int l,r,largest;
l = Left(i);
r = Right(i);
if( l <= Heap_Size && A[l] > A[i] )
largest = l;
else
largest = i;
if( r <= Heap_Size && A[r] > A[largest] )
largest = r;
if( largest != i )
{
int temp = A[i];
A[i] = A[largest];
A[largest] = temp;
Max_Heapify( A, largest );
}
}
void Min_Heapify( int *A, int i )
{
int l,r,smallest;
l = Left(i);
r = Right(i);
if( l <= Heap_Size && A[l] < A[i] )
smallest = l;
else
smallest = i;
if( r <= Heap_Size && A[r] < A[smallest] )
smallest = r;
if( smallest != i )
{
int temp = A[i];
A[i] = A[smallest];
A[smallest] = temp;
Min_Heapify( A, smallest );
}
}
void Build_Max_Heap( int *A )
{
Heap_Size = length;
for( int i = floor(length/2); i >= 1; --i )
{
Max_Heapify( A, i );
}
}
void Build_Min_Heap( int *A )
{
Heap_Size = length;
for( int i = floor(length/2); i >= 1; --i )
{
Min_Heapify( A, i );
}
}
void HeapSort( int *A )
{
Build_Max_Heap( A );
for( int i = length; i >= 2; --i )
{
int temp = A[1];
A[1] = A[i];
A[i] = temp;
Heap_Size--;
Max_Heapify( A, 1 );
}
}
void print( int *A, int n )
{
for( int i = 1; i <= n; i++ )
{
std::cout << A[i] << " ";
}
std::cout << std::endl;
}
int main( int argc, char* argv[] )
{
std::cout << " input the length of the array: ";
std::cin >> length;
int *A;
A = new int[length+1];
for( int i = 1; i < length+1; i++ )
{
std::cin >> A[i];
}
HeapSort( A );
print( A, length );
}