思想:
1.构建最大堆
2.把根节点和最后一个节点交换,,把堆长度-1,也就不考虑放最后的最大的元素了,再构建最大堆
3.现在第二大的元素在根节点了,我们再重复步骤2,直到堆长度为1
void MaxHeap(int a[],int fa,int n){ int i,s=a[fa]; for(i=fa<<1;i<=n;i<<=1){ if(i<n&&a[i]<a[i+1])i++; if(s>a[i])break; a[i>>1]=a[i]; } a[i>>1]=s; } void BuildHeap(int a[],int n){ for(int i=n>>1;i>=1;i--) MaxHeap(a,i,n); } void HeapSort(int a[],int n){ BuildHeap(a,n); for(int i=n;i>=2;i--){ int t=a[i]; a[i]=a[1]; a[1]=t; MaxHeap(a,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]<<" ";