#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
int *A;
int const LEN = 10;
void MAX_HEAPIFY(int a[],int i,int len);
void BUILD_MAX_HEAP(int a[],int len);
void HEAP_SORT(int a[],int len);
void SWAP(int a[],int i,int j);
int main()
{
A = new int[LEN];
srand(time(0));
cout<<"before sort;"<<endl;
for(int i = 0;i <LEN;i++)
{
A[i] = rand()%100;
cout<<A[i]<<" ";
}
cout<<endl;
HEAP_SORT(A,LEN);
cout<<"after sort:"<<endl;
for(int i = 0;i < LEN;i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
}
void MAX_HEAPIFY(int a[],int i,int len)
{
/*
*条件:节点i的左右子树均为最大堆
*功能:将以节点i为根的树变为最大堆
*/
int left = i*2+1;
int right = i*2 + 2;
int largest = i;
if(left < len && A[left]>A[largest])
largest = left;
if(right < len && A[right]>A[largest])
largest = right;
if(largest != i)
{
/*节点i破坏最大堆条件,将左右孩子中最大的一个与之交换*/
SWAP(a,i,largest);
/*对交换后的子树进行调整*/
MAX_HEAPIFY(a,largest,len);
}
}
void BUILD_MAX_HEAP(int a[],int len)
{
/*
*采用自底向上的方式,构造最大堆
*/
for(int i = len/2;i >= 0;i--)
{
MAX_HEAPIFY(a,i,len);
}
}
void HEAP_SORT(int a[],int len)
{
/*
*进行堆排序
*/
BUILD_MAX_HEAP(a,len); //首先将原数组构造成最大堆
for(int i = len-1;i >= 1;i-- )
{
SWAP(a,0,i); //交换当前树的根节点和最后一个叶结点
MAX_HEAPIFY(a,0,i); //调整当前树再次成为最大堆
}
}
void SWAP(int a[],int i,int j)
{
/*
*交换数组a中的a[i]和a[j]
*/
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}