参考文献1:算法导论第六章讲解 堆排序
参考文献2:<a target=_blank href="http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621">http://blog.csdn.net/xiaoxiaoxuewen/article/details/7570621</a>
/****************************************************************************/
/*time:2014.11.15 author:chen stallman */
/*1.如何建立最大堆 */
/*2.把数组转换成最大堆 */
/*3.把建好的堆中数据与原数组进行数据交换 */
/******************************************************************************/
#include<iostream>
#include<algorithm>
using namespace std;
void swap(int *x, int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
//建立以root为i(即根节点为i)的最大堆,利用了递归的思想防止调整之后以largest为父节点的子树不是最大堆
void max_heapify(int a[], int i, int heapsize)
{
int l = 2 * i;//取其左孩子的坐标
int r = 2 * i + 1;//取其右孩子的坐标
int largest;//临时变量,用来保存r、l、r三个节点中最大的值
if (l<=heapsize&&a[l]>a[i])
largest = l;
else
largest = i;
if (r<=heapsize&&a[r]>a[largest])
largest = r;
if (largest != i)
{
swap(&a[i], &a[largest]);
max_heapify(a, largest, heapsize);
}
}
//***********************************************
//用自底向上的方法把数组转换成最大堆
void buil_max_heap(int a[], int heapsize)
{
int i;
for (i = heapsize / 2; i >= 1; i--)
{
max_heapify(a, i, heapsize);
}
}
//有了上面这个两个辅助功能函数就可以对数组进行堆排序了
void heap_sort(int a[], int len)
{
int i;
buil_max_heap(a, len);
for (i = len; i >= 2; i--)
{
swap(&a[1], &a[len]);
len--;
max_heapify(a, 1, len);
}
}
int main()
{
//这里数组下标从1开始,数组第一个元素没有使用
int a[] = { 0,12,-3,88,52,6,4,33,2,100,5,20};
heap_sort(a, 11);
for (auto i : a)
cout << i << " ";
cout << endl;
return 0;
}原文:http://blog.csdn.net/chenxun_2010/article/details/41131445