//交换位于i和j处的值
void exchange(int *a,int i,int j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
//保持最大堆的特性
void max_heapify(int *a,int i,int length)
{
int l = i*2+1;//求左孩子结点,由于数据是从0开始计数,故需要乘以2加1
int r = (i+1)*2;//求右孩子结点
int largest = i;
if (l<=length&&a[l]>a[i])
{
largest = l;
}
if (r<=length&&a[r]>a[largest])
{
largest = r;
}
if (largest != i)
{
exchange(a,i,largest);
max_heapify(a,largest,length);//递归使子结点满足最大堆的特性
}
}
void heap_sort(int *a,int len)
{
int length = len-1; //由于C++的下标是从0开始,故长度在原有的长度上-1
int i;
for (i = length/2;i>=0;i--) //从叶结点开始,创建最大堆
{
max_heapify(a,i,length);
}
for (i = length;i>0;i--) //根据最大堆进行排序
{
exchange(a,0,i);
max_heapify(a,0,i-1);
}
}