思想:
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]<<" ";