#include <stdio.h>
#include <stdlib.h>
void build_heap(int data[], int);
void adjust_heap(int data[], int);
void heap_sort(int data[], int);
int sub_max_heap(int data[], int, int);
int main(int argc, char *argv[])
{
	int i;
	int data[12] = {6, 10, 3, 5, 12, 8, 4, 23, 1, 2, 9, 7 };
	heap_sort(data, 12);
	for (i = 0; i < 12; ++i)
	{
		printf("%d ", data[i]);
	}
	printf("\n");
	return 0;
}
void heap_sort(int data[], int num)
{
	int i = 1;
	build_heap(data, num);
	for (i = 1; i < num; ++i)
	{
		int temp;
		temp = data[0];
		data[0] = data[num - i];
		data[num - i] = temp;
		adjust_heap(data, num - i);	
	}
}
void build_heap(int data[], int num)
{
	int i, k, p;
	for (i = num / 2 - 1; i >= 0; --i)
	{
		k = sub_max_heap(data, num, i);
		while (2 * k + 1 < num)
		{
			p = k;
			k = sub_max_heap(data, num, p);
		}
	}
}
void adjust_heap(int data[], int num)
{
	int temp;
	int k, p;
	k = 0;
	while(2 * k + 1 < num)
	{
		p = k;
		k = sub_max_heap(data, num, p);
	}
}
int sub_max_heap(int data[], int num, int i)
{
	int k;
	if (2 * i + 2 <= num - 1 && data[2 * i + 1] > data[2 * i + 2])
		k = 2 * i + 1;
	else if (2 * i + 2 <= num - 1)
		k = 2 * i + 2;
	else
		k = 2 * i + 1;
	if (data[k] > data[i])
	{
		int temp;
		temp = data[k];
		data[k] = data[i];
		data[i] = temp;
	}
	
	return k;
}
/*
int sub_max_heap(int data[], int num, int i)
{
	int largest;
	int l, r;
	l = 2 * i + 1;
	r = 2 * i + 2;
	
	if (l <= num - 1 && data[l] > data[i])
		largest = l;
	else
		largest = i;
	
	if (r <= num - 1 && data[r] > data[largest])
		largest = r;
	if (largest != i)
	{
		int temp;
		temp = data[i];
		data[i] = data[largest];
		data[largest] = temp;
	}
	return largest;
}
*/
原文:http://www.cnblogs.com/yyxayz/p/3997957.html