#include<iostream>
#include<stdio.h>
using namespace std;
/**
创建一个堆:大的数是根
*/
void swap(int arr[],int i,int j)
{
	int temp= arr[i];
	arr[i]=arr[j];
	arr[j]=temp;
}
void heapify(int tree[],int n,int i)
{
	//检查输入的这个节点的位置对不对
	//如果大的数在底层就让它上去
	if(i>=n)
	{
		return;
	}
	int c1 = 2*i+1;
	int c2 = 2*i+2;
	//计算两个儿子的编号
	int max = i;
	if(c1<n && tree[c1]>tree[max])
	{
		max=c1;
	}
	if(c2<n && tree[c2]>tree[max])
	{
		max=c2;
	}
	//查找儿子们和父亲中那个大
	if(max!=i)
	{
		swap(tree,max,i);
		heapify(tree,n,max);
	}
	//如果儿子大于父亲就交换
	//然后继续往下一层判断
}
void build_heap(int tree[],int n)
{
	//对每一节点都检查一遍就成功建立成了一个堆
	int last_node = n-1;
	int parent=(last_node-1)/2;
	for(int i=parent;i>=0;--i)
	{
		heapify(tree,n,i);
	}
}
/*
堆排序:从大到小
*/
void heap_sort(int tree[],int n)
{
	build_heap(tree,n);
	for(int i=n-1;i>=0;--i)
	{
		swap(tree,i,0);//交换根节点和最后一个叶子
		heapify(tree,i,0);//砍断那个最后的叶子
	}
}
int main()
{
	int tree[]={4,10,2,5,1,3};
	int n=6;
	//堆排序
	heap_sort(tree,n);

	for(int i=0;i<n;++i)
	{
		cout<<tree[i]<<" "<<endl;
	 }
	return 0;
} 

来自灯神的讲解,这里我加了一点自己的注释:https://www.bilibili.com/video/av47196993

01-05 09:51