#include <iostream>
void swap(int tree[],int n,int t)
{
int temp;
temp=tree[n];
tree[n]=tree[t];
tree[t]=temp;
}
void build_heap(int tree[],int n){
//创建堆
for(int i=n/2-1;i>=0;i--)// n/2-1是最底部最右边的一家的父节点 最后一个家的父节点
{
//堆化 将顶节点和左右子节点 堆化 顶节点大于子节点
if((2*i+1)<n)
{
if(tree[i]<tree[2*i+1] )
{ swap(tree,i,2*i+1);}
}
if((2*i+2)<n)
{
if(tree[i]<tree[2*i+2])
{swap(tree,i,2*i+2);}//创建时,如果一开始父节点比子节点小则替换。-这是具体堆化过程
}
}
}
void build_sort(int tree[],int n){
//
build_heap(tree,n);//从底部的父节点开始堆化,则每家都选出来最大的父,最后顶部就是家族最大的根祖宗。
for(int i=n-1;i>=0;i--)
{
std::cout<<tree[0]<<"------"<<std::endl;
swap(tree,i,0);//每次循环将最大(顶点)替换为最后一个 顶点最大可以放入排序好的队列了
//最后排序队列 (截断 最后一个点 就是除去被替换的最大顶点 因为它已经被放入排序好的队列 )
build_heap(tree,i);//只排序0--i-1 i个数据 i---到n的数据已经按照从小到大排序了
}
}
int main( )
{
int tree[]={11,10,9,12,13,1,2,6,8,4,5,3};
int n=sizeof(tree)/sizeof(*tree);
build_sort(tree,n);
for(int i=0;i<n;i++)
{
std::cout<<tree[i]<<"-"<<std::endl;
}
}
03-15
77
07-19
265
08-08
74