void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void ajustHeap(int a[], int start, int len) //根节点值变动后调整成新的大根堆
{
int dad = start, son = 2 * dad + 1;
while (son < len)
{
if (son + 1 < len && a[son] < a[son + 1]) //比较子节点
{
son++;
}
if (a[dad] < a[son])
{
swap(a + dad, a + son);
dad = son;
son = 2 * dad + 1;
}
else
break;
}
}
void createHeap(int a[], int start, int len)
{
if (a == NULL || start < 0 || len <= 0)
return;
int i = len - 1, son, dad;
for (; i > 0; i--)
{
son = start + i;
dad = (son - 1) / 2;
if (a[son] > a[dad]) //子节点 > 父节点 交换
{
swap(a + son, a + dad);
dad = son;
son = dad * 2 + 1;
if ((son < len && a[dad] < a[son]) || (son + 1 < len && a[dad] < a[son + 1])) //交换后判断子节点和孙子节点是否满足子节点 > 孙子节点
{
ajustHeap(a, dad, len);
}
}
}
}
void heapSort(int a[], int len)
{
for (int i = 1; i < len; ++i)
{
swap(a, a + len - i);
ajustHeap(a, 0, len - i);
}
}
int main(int argc, char **argv)
{
int a[] = { 3, 7, 4, 1, 32, 23, 66, 43, 12, 61, 17, 6, 9, 0, 5 };
int len = sizeof(a) / sizeof(int);
createHeap(a, 0, len);
heapSort(a, len);
for (int i = 0; i < len; ++i)
{
printf("%d ", a[i]);
}
printf("\n");
system("pause");
return 0;
}
测试结果: