#include <stdio.h>
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
// 调整堆
void herify(int *a, int index, int len)
{
int lindex = 2*index + 1; // 左孩子结点下标
int rindex = 2*index + 2; // 右孩子结点下标
int max = index;
if (lindex<len && a[max]<a[lindex])
max = lindex;
if (rindex<len && a[max]<a[rindex])
max = rindex;
if (max != index)
{
mySwap(a, max, index);
herify(a, max, len);
}
}
void mySort(int *a, int len)
{
// 建堆: 从非叶节点开始,把每一个结点搞成大顶堆
int i;
for (i = len/2-1; i>=0; i--)
{
herify(a, i, len);
}
// 排序
int count = len;
for (i=len-1; i > 0; i--)
{
mySwap(a, 0, i); // 堆顶元素和当前堆最后一个元素进行交换
count--;
herify(a, 0, count);
}
}
int main()
{
int a[] = {5,8,6,7,9,4,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a, len);
myPrint(a, len);
return 0;
}