数据结构—堆的学习:堆化数组、堆的插入、堆的删除

原网页:http://blog.csdn.net/morewindows/article/details/6709644

程序如下:

//数据结构堆的创建(堆化数组)、堆的插入和删除
#include<stdio.h>
#include <stdlib.h>
//交换两个元素值
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;
}


猜你喜欢

转载自blog.csdn.net/u012258911/article/details/48053657
今日推荐