#include <stdio.h>
#include <stdlib.h>
int paraent(int i);
int leftchild(int i);
int rightchild(int i);
void max_heap(int data[],int i,int len);
void bulid_max_heap(int data[],int len);
void heap_sort(int data[],int len);
int main()
{
int nData[10] = {4,10,9,8,7,6,5,4,3,2}; //创建10个数据,测试
heap_sort(nData, 10);
for (int i = 0; i < 10; ++i)
{
printf("%d ", nData[i]);
}
printf("/n");
system("puase");
return 0;
}
int paraent(int i)
{
return (i-1)/2;
}
int leftchild(int i)
{
return 2*i+1;
}
int rightchild(int i)
{
return 2*(i+1);
}
void max_heap(int data[],int i,int len)//左右子树都已经是最大堆,但父节点并不一定是最大的
{
int l=leftchild(i);
int r=rightchild(i);
int largest;
if(l<len&&data[l]>data[i])//注意要判断是否有左右子树
largest=l;
else
largest=i;
if(r<len&&data[r]>data[largest])
largest=r;
if(largest!=i)//交换至对大的跟节点
{
int temp=data[i];
data[i]=data[largest];
data[largest]=temp;
}
else
return;
max_heap(data,largest,len);//依次往下看
}
void bulid_max_heap(int data[],int len)
{
int num=(len-1)/2;
for(int i=num;i>=0;i--)//从叶节点开始构造,叶节点已经是最大堆
max_heap(data,i,len-1);
}
void heap_sort(int data[],int len)
{
bulid_max_heap(data,len); //构建出最大堆
int num=len;
for(int i=len-1;i>=1;i--)
{
int temp=data[0];//将最大数,根节点与最小的交换
data[0]=data[i];
data[i]=temp;
num=num-1;//则最小的点为最大的数,然后将最小点去掉
max_heap(data,0,num);//让其在形成最大堆
}
}