因为很多书都介绍了原理,这里就不过多阐述这里直接贴上代码再说。
测试代码:
//#include"b_heapsort.h"
#include"s_heapsort.h"
int main(int argc,char **argv)
{
int data[8]={2,5,3,4,7,8,9,1,};
int i;
for(i=0;i<8;i++)
printf("%d ",data[i]);
printf("\n");
InitCreateHeap(data,8);
for(i=0;i<8;i++)
printf("%d ",data[i]);
printf("\n");
HeapSort(data,8);
for(i=0;i<8;i++)
printf("%d ",data[i]);
return 0;
}
大顶堆:
#include
void CreateHeap(int data[],int n,int h)
{
int i,j,flag;
int temp;
i=h;//i为要创建堆的二叉树下标
j=2*i+1;//j为i节点的左孩子i
flag=0;
temp=data[i];
while(j
data[j])//如果根节点值大于叶子节点的值则直接跳出
flag=1;
else//如果根节点的值小于叶子节点的值
{
data[i]=data[j];//让根结点的值为叶子节点的值
i=j;
j=2*i+1;
}
}
data[i]=temp;//将data[i的值复制给最后的a[j]
}
//堆初始化 data为数组元素,n为元素的个数
void InitCreateHeap(int data[],int n)
{
int i;
i=(n-2)/2;
for(;i>=0;i--)//i代表了非叶子节点的深度
CreateHeap(data,n,i);//创建堆
}
void HeapSort(int data[],int n)
{
int i;
int temp;//待交换的元素
InitCreateHeap(data,n);//初始化堆
for(i=n-1;i>0;i--)
{
temp=data[0];
data[0]=data[i];
data[i]=temp;
CreateHeap(data,i,0);//创建新的堆
}
}
#include
void CreateHeap(int data[],int n,int h)
{
int i,j,flags;
int temp;
i=h;
j=i*2+1;//左孩子节点
flags=0;
temp=data[i];
while(j
data[j+1])
j++;
if(data[j]>temp)
flags=1;
else
{
data[i]=data[j];
i=j;//i编程了j
j=2*i+1;
}
}
data[i]=temp;
}
void InitCreateHeap(int data[],int n)
{
int i;
for(i=(n-2)/2;i>=0;i--)
CreateHeap(data,n,i);
}
void HeapSort(int data[],int n)
{
int i;
int temp;
InitCreateHeap(data,n);
for(i=n-1;i>0;i--)
{
temp=data[0];
data[0]=data[i];
data[i]=temp;
CreateHeap(data,i,0);
}
}
第一个为大顶堆的排序结果,第二个为小顶堆的排序结果