1、堆排序算法描写叙述:
(1)定义
然后再次将R[1..n-1]中keyword最大的记录R[1]和该区间的最后一个记录R[n-1]交换。由此得到新的无序区R[1..n-2]和有序区R[n-1..n]。且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,相同要将R[1..n-2]调整为堆。
然后将堆的根节点取出(通常是与最后一个节点进行交换)。将前面len-1个节点继续进行堆调整的过程,然后再将根节点取出,这样一直到全部节点都取出。堆排序过程的时间复杂度是O(nlgn)。由于建堆的时间复杂度是O(n)(调用一次)。调整堆的时间复杂度是lgn,调用了n-1次。所以堆排序的时间复杂度是O(nlgn)。
i结点的左右子结点下标分别为
2*i+1和2*i+2。#include <iostream>
void printArray(int theArray[], int n)
{
	for(int i = 0; i < n; i++)
	{
		std::cout << theArray[i] << " ";
	}
	std::cout << std::endl;
}
void adjustHeap(int theArray[], int n, int start)  //从start索引处结点開始调整 
{
	if(start < 0 || start >= n)
		return;
	int fatherIndex;
	int leftIndex;
	int rightIndex;
	int tmp;
	
	fatherIndex = start;
	leftIndex = 2 * fatherIndex + 1;        //start索引处结点的左孩子的索引 
	rightIndex = leftIndex + 1;             //start索引处结点的右孩子的索引 
	
	if(rightIndex < n)          //start索引处结点存在右孩子结点. 
	{
		if(theArray[fatherIndex] < theArray[rightIndex])     //右孩子结点大于start索引处结点 。交换 
		{
			tmp = theArray[fatherIndex];
			theArray[fatherIndex] = theArray[rightIndex];
			theArray[rightIndex] = tmp; 
		}
	}
	if(leftIndex < n)       //start索引处结点存在左孩子结点,但不一定存在右孩子结点
	{
		if(theArray[fatherIndex] < theArray[leftIndex])     //右孩子结点大于左孩子结点树,交换 
		{
			tmp = theArray[fatherIndex];
			theArray[fatherIndex] = theArray[leftIndex];
			theArray[leftIndex] = tmp;
		}
	} 
	adjustHeap(theArray, n, start-1);         //再次递归调整start索引处的上一个结点 
}
void constructHeap(int theArray[], int n)
{
	int start = n / 2; 
	adjustHeap(theArray, n, start);                 //从length/2处開始调整 
}
void heapSort(int theArray[], int n)
{
	if(n == 1)                                    //当未排序序列中仅仅剩一个元素时,直接跳出递归 
		return;
	int length = n;
	
	//printArray(theArray, length);              //打印出每次建立最大堆之后,数组排列情况 
	
	//将最大堆的堆顶元素与堆末尾元素交换,并取出该元素作为已排序数组元素 
	int tmp = theArray[0];                    
	theArray[0] = theArray[length-1];
	theArray[length-1] = tmp;
	 
	//再次调整交换后的堆,使得为满足最大堆 
	--length;                 //未排序序列长度减一 
	int start = length / 2;   
	adjustHeap(theArray, length, start);
	heapSort(theArray, length);             //递归进行堆排序 
}
int main(int argc, char *argv[]) {
	int myArray[] = {5,90,28,4,88,58,38,18,19,20};
	int length = sizeof(myArray) / sizeof(myArray[0]);
	constructHeap(myArray, length);
	heapSort(myArray, length);
	printArray(myArray, length);
	return 0;
}原文:http://www.cnblogs.com/jhcelue/p/7257012.html