原文出处:http://www.cnblogs.com/mengdd/archive/2012/11/30/2796845.html
#include<iostream>
using namespace std;
typedef int ElemType;
void HeapAdjust(ElemType H[], int start, int end)
{
ElemType temp = H[start];
for (int i = 2 * start + 1; i <= end; i *= 2)
{
//因为假设根结点的序号为0而不是1,所以i结点左孩子和右孩子分别为2i+1和2i+2
if (i<end && H[i]<H[i + 1])//左右孩子的比较
{
++i;//i为较大的记录的下标
}
if (temp > H[i])//左右孩子中获胜者与父亲的比较
{
break;
}
//将孩子结点上位,则以孩子结点的位置进行下一轮的筛选
H[start] = H[i];
start = i;
}
H[start] = temp; //插入最开始不和谐的元素
}
void HeapSort(ElemType A[], int n)
{
//先建立大顶堆
for (int i = n / 2; i >= 0; --i)
{
HeapAdjust(A, i, n);
}
//进行排序
for (int i = n - 1; i>0; --i)
{
//最后一个元素和第一元素进行交换
ElemType temp = A[i];
A[i] = A[0];
A[0] = temp;
//然后将剩下的无序元素继续调整为大顶堆
HeapAdjust(A, 0, i - 1);
}
}
int main()
{
int a[100];
for (int i = 0; i < 10; i++)
std::cin >> a[i];
HeapSort(a, 10);
for (int i = 0; i < 10; i++)
cout << a[i] << ' ';
while (1);
}