数据结构-堆排

堆排

原理:除去底层,一个一个由三个点结合而成的小三角进行内部的比较
发生位置变化的时候,又会从上向下一个个小三角形的进行比较

代码

#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;	 
}
原文地址:https://www.cnblogs.com/BeautifulWater/p/14559739.html