堆排序算法

#include<iostream>   
using namespace std;  
//获取父节点   
int Parent(int i)  
{  
	return i/2;  
}  
//获取左孩子   
int Left(int i)  
{  
	return 2*i;  
}  
//获取右孩子   
int Right(int i)  
{  
	return 2*i+1;  
}  
//从i节点开始构造最大堆   
void MaxHeap(int *a,int i,int length)  
{  
	int L,R;  
	L=Left(i);  
	R=Right(i);  
	int largest;  
	if(L <= length && a[L-1] > a[i-1])  
	{  
		largest=L;  
	}  
	else  
	{
		largest=i; 
	}
	if(R <= length && a[R-1] > a[largest-1])  
	{  
		largest=R;  
	}  
	//比较i节点和它子节点 如果需要调整 则先进行调整 然后再递归构造该节点
	if(largest != i)  
	{  
		int temp;  
		temp=a[i-1];  
		a[i-1]=a[largest-1];  
		a[largest-1]=temp;  
		MaxHeap(a,largest,length);  
	}  
}  
 
//堆排序   
void HeapSort(int *a,int length)  
{  
	////将整个树生成最大堆  从最后一个非叶子节点开始构造   
	for(int i=length/2;i>=1;i--)  
	{  
		MaxHeap(a,i,length);  
	}  

	//不断将大根堆根节点放在length下标对应的位置 然后构建length-1大根堆
	for(int i=length;i>0;i--)  
	{  
		int temp;  
		temp=a[i-1];  
		a[i-1]=a[0];  
		a[0]=temp;  
		length-=1;  
		MaxHeap(a,1,length);  
	}  
}  
int main()  
{  
	int a[10]={4,1,3,2,16,9,10,14,8,7};  
	HeapSort(a,10);  
	for(int i=0;i<10;i++)  
	{  
		cout<<a[i]<<" ";  
	}  
	cout<<endl;  
}  

 

posted on 2014-11-05 21:43  kangbry  阅读(132)  评论(0编辑  收藏  举报

导航