1、程序文件
/*
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
堆是一个近似完全二叉树的结构,并同时满足堆积的性质:
即子结点的键值或索引总是小于(或者大于)它的父节点。
在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种操作:
最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
创建最大堆(Build Max Heap):将堆中的所有数据重新排序
堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
*/
#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;
}
2、测试结果
root@lj:/mnt/hgfs/shared-lj# gcc 堆排序stufdy.c
root@lj:/mnt/hgfs/shared-lj# ./a.out
0 1 2 3 4 5 6 7 8 9