原网页:/morewindows/article/details/6709644
程序如下:
//数据结构堆的创建(堆化数组)、堆的插入和删除
#include<>
#include <>
//交换两个元素值
void swap(int &a,int &b)
{
if(a!=b)
{
a=a^b;
b=a^b;
a=a^b;
}
}
//从结点i处开始调整,使之成为最小堆 n为结点总数,一般从0开始计算, i结点的子节点为2*i+1,2*i+2 将大数下沉
void MinHeapFixDown(int a[],int i,int n)
{
int j,temp;
temp=a[i];
j=2*i+1;
while (j<n)
{
if (j+1<n&&a[j+1]<a[j]) //找出i结点子节点的最小的
j++;
if (a[j]>=temp) //子节点最小值大于父结点,即找到父节点应该放的位置:最后一次更新的i
break;
a[i]=a[j]; //子节点最小值小于父节点的值,将较小的子节点往上移动过,替换它的父节点
i=j;
j=2*i+1;
}
a[i]=temp;
}
//调整为最大堆 将小的数下沉
void MaxHeapFixDown(int a[],int i,int n)
{
int j,temp;
temp=a[i];
j=2*i+1;
while (j<n)
{
if (j+1<n&&a[j+1]>a[j]) //找出i结点子节点的最大的
j++;
if (a[j]<temp) //子节点最大值小于父结点,即找到父节点应该放的位置:最后一次更新的i
break;
a[i]=a[j]; //子节点最大值大于父节点的值,将较小的子节点往上移动过,替换它的父节点,
i=j; //并更新i,j
j=2*i+1;
}
a[i]=temp;
}
//将数组A进行堆化,即数组经转换后模拟的是一个最小堆
void MakeMinHeap(int a[],int n)
{
for (int i=n/2-1;i>=0;i--)
MinHeapFixDown(a,i,n);
}
//将数组A进行堆化,即数组经转换后模拟的是一个最大堆
void MakeMaxHeap(int a[],int n)
{
for (int i=n/2-1;i>=0;i--)
MaxHeapFixDown(a,i,n);
}
//数组数据堆排序 最小堆 降序排序 前提:该数组已是一个最小堆
void MinHeapSortDes(int a[],int n)
{
for (int i=n-1;i>=1;i--)
{
swap(a[i],a[0]);
MinHeapFixDown(a,0,i);
}
}
//数组数据堆排序 最大堆 升序排序 前提:该数组已是一个最大堆
void MaxHeapSortDes(int a[],int n)
{
for (int i=n-1;i>=1;i--)
{
swap(a[i],a[0]);
MaxHeapFixDown(a,0,i);
}
}
//堆的操作:插入与排序
//堆的插入:用数组模拟堆,插入的元素在数组的最后,插入后再调整堆
//新加入结点i其父节点为(i-1)/2 最小堆插入调整
void MinHeapFixup(int a[],int i)
{
int j,temp;
temp=a[i];
j=(i-1)/2;
while(j>=0)
{
if(a[j]<=temp)
break;
a[i]=a[j];
if (0==j)
{
a[j]=temp;
break;
}
i=j;
j=(i-1)/2;
}
if (j!=0)
{
a[i]=temp;
}
}
//在最小堆中插入数据nNum
void MinHeapInsert(int a[],int n,int nNum)
{
a[n]=nNum;
MinHeapFixup(a,n);
}
//堆的删除:每次删除第0个数据,将最后一个数据的值赋给根节点,然后调整堆
//在最小堆中删除数
void MinHeapDeleteNumber(int a[],int n)
{
swap(a[0],a[n-1]); //交换第一个元素与最后一个元素(相当于删除第一个元素)
MinHeapFixDown(a,0,n-1); //从上往下调整堆
}
//测试程序
int main()
{
int A[]={9,12,17,30,50,20,60,65,4,49};
int len=sizeof(A)/sizeof(A[0]);
MakeMinHeap(A,len); //最小化堆(堆化数组)
// MakeMaxHeap(A,len); //最大化堆
for (int i=0;i<len;i++)
printf("%d ",A[i]);
printf("\n");
MinHeapDeleteNumber(A,len); //堆的删除
/*MinHeapInsert(A,len,2);*/ //堆的插入
for (int i=0;i<len;i++)
printf("%d ",A[i]);
printf("\n");
// MaxHeapSortDes(A,len); //堆排序 最大堆 升序
// MinHeapSortDes(A,len); //堆排序 最小堆 降序
// for (int i=0;i<len;i++)
// printf("%d ",A[i]);
// printf("\n");
// for (int i=0,j=len-1;i<j;i++,j--) //数组元素倒序
// swap(A[i],A[j]);
// for (int i=0;i<len;i++)
// printf("%d ",A[i]);
system("pause");
return 0;
}