标签:
思想:
1.构建最大堆
2.把根节点和最后一个节点交换,,把堆长度-1,也就不考虑放最后的最大的元素了,再构建最大堆
3.现在第二大的元素在根节点了,我们再重复步骤2,直到堆长度为1
int MaxHeap(int DataArray[],int Father,int DataLen){
int LeftSon=Father<<1;
int RightSon=LeftSon+1;
int largest=Father;
if(LeftSon<=DataLen&&DataArray[LeftSon]>DataArray[Father]){
largest=LeftSon;
}
if(RightSon<=DataLen&&DataArray[RightSon]>DataArray[largest]){
largest=RightSon;
}
if(largest!=Father){
int tem=DataArray[Father];
DataArray[Father]=DataArray[largest];
DataArray[largest]=tem;
MaxHeap(DataArray,largest,DataLen);
}
}
int BuildHeap(int DataArray[],int DataLen){
for(int i=DataLen>>1;i>=1;i--)
MaxHeap(DataArray,i,DataLen);
}
int HeapSort(int DataArray[],int DataLen){
BuildHeap(DataArray,DataLen);
int tmp;
for(int i=DataLen;i>=2;i--){
tmp=DataArray[i];
DataArray[i]=DataArray[1];
DataArray[1]=tmp;
MaxHeap(DataArray,1,i-1);
}
}
调用:
for(int i=1; i<=n; i++) //注意是从1开始
cin>>a[i];
HeapSort(a,n);
for(int i=1; i<=n; i++)cout<<a[i]<<" ";
标签:
原文地址:http://www.cnblogs.com/flipped/p/5004708.html