网上找到的一篇比较好的堆排序讲解:https://www.cnblogs.com/chengxiao/p/6129630.html
/***************************************************************
File Name: heap_sort.c
Author: 浮生流年
Function List: main() 主函数
Created Time: 2018年01月30日 星期二 10时14分14秒
**************************************************************/
#include <stdio.h>
void maxHeap(int a[], int start, int end)
{
int child, tmp;
for (tmp = a[start]; 2*start + 1 < end; start = child)
{
child = 2*start + 1;//左孩子
//如果存在右孩子并且左孩子小于右孩子,选择值较大的孩子
if (child + 1 < end && a[child] < a[child + 1])//左右孩子之间比较大小
{
child++;
}
if (a[start] < a[child])//最大孩子与父亲节点比较大小
{
a[start] = a[child];
a[child] = tmp;
}
else break;
}
}
void heap_sort(int a[], int len)
{
int i;
//先构造大根堆
//数组下表从0开始,那么第一个非叶子节点i = len / 2
for (i = len/2 - 1; i >= 0; i--)
{
maxHeap(a, i, len);
}
//再将关键字最大的记录和无序区的最后一个记录交换
for (i = len - 1; i > 0; i--)
{
int tmp = a[i];
a[i] = a[0];
a[0] = tmp;
//由于交换后新的根可能违反大根堆性质,故应将当前无序区再次调整为大根堆
maxHeap(a, 0, i);
}
}
int main()
{
int data[] = {1, 5, 3, 7, 9, 6, 4, 5, 2};
int i;
int length = sizeof(data) / sizeof(data[0]);
heap_sort(data, length);
for (i = 0; i < length; i++)
{
printf("%d ", data[i]);
}
printf("\n");
return 0;
}