数值方法课程中的程序

源代码在线查看: 堆的建立.txt

软件大小: 7 K
上传用户: kight521
关键词: 数值 程序
下载地址: 免注册下载 普通下载 VIP

相关代码

				程序:堆的建立,由一个空堆,不断进行插入函数的调用,生成一个新堆。需要注意的是,插入第一个数时,与0进行比较,所以这个0不会消失,需要最后对其进行删除操作,因此在建立堆的过程中,要随时记录这个0的具体位置,以便最后进行删除。本程序中子函数包括上移、下移、插入、建立以及删除函数。完全实现预期的功能。
				#include
				int N=1;
				void sift_up(int H[],int i)
				{  int t;
				   bool done=false;
				   if(i!=0)
				   {  while(!done && i!=0)
				
				      {  if(H[i]>H[(i-1)/2])
				           {  t=H[i];H[i]=H[(i-1)/2];H[(i-1)/2]=t;
				              
				              if(((i-1)/2)==N)
				              {N=i;}
				            }
				         else done=true;
				         i=(i-1)/2;
				      }
				   }
				}
				
				void sift_down(int H[],int n,int i)
				{  int t;
				   bool done=false;
				   if((2*i)				   {  while(!done && ((i=2*i)				
				      {  if((i+2)H[i+1])
				           i=i+2;
				         else i=i+1;
				         if(H[(i-1)/2]				           {  t=H[(i-1)/2];H[(i-1)/2]=H[i];H[i]=t;}
				         else done=true;
				      }
				   }
				}
				
				void insert(int H[],int n,int x)
				{  n=n+1;
				   H[n]=x;
				   sift_up(H,n);
				}
				
				void make_heap1(int A[],int H[],int n)
				{  int i,m=0;
				   for(i=0;i				     {insert(H,m,A[i]);
				       m=m+1;}
				}
				
				void delete1(int H[],int n,int i)
				{  int x,y;
				   x=H[i];
				   y=H[n];
				   n=n-1;
				   if(i				   {  H[i]=y;
				      if(y>=x)
				        sift_up(H,i);
				      else
				        sift_down(H,n,i);
				   }
				}
				
				void main()
				{  int k;
				   int a[]={25,1,3,17,23,12,29,33,11,7,15,78,35,68,356,796,235,678,34,79};
				   int b[20]={};
				   make_heap1(a,b,20);
				   for(k=0;k				   cout				   delete1(b,20,N);
				   for(k=0;k				   {cout				   cout				   
				 }			

相关资源