堆排
原理:除去底层,一个一个由三个点结合而成的小三角进行内部的比较
发生位置变化的时候,又会从上向下一个个小三角形的进行比较
代码
#include<iostream>
#include<stdio.h>
using namespace std;
#define Max 2000000
int n,H[Max];
void maxHeapify(int i)
{
int l,r,largest=i;
l=2*i;
r=2*i+1;
if(l<=n&&H[l]>H[largest])largest=l;
if(r<=n&&H[r]>H[largest])largest=r;
if(largest!=i)
{
swap(H[largest],H[i]);
maxHeapify(largest);//大的从下面往上面移,小的往上面移,但有可能由于小的加入导致加入的三角形变得不稳定
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>H[i];
for(int i=n/2;i>=1;i--)//n/2是最后一个结点的根节点(n/2右边的结点都是没有子树的)
maxHeapify(i);
for(int i=1;i<=n;i++)
cout<<H[i]<<" ";
cout<<endl;
return 0;
}