1. 程式人生 > >堆的建立及堆排序

堆的建立及堆排序

以下內容展示了堆的建立,在堆中刪除和插入元素等操作。



#include<stdio.h>
#define MAX 15

void makeHeap(int a[],int n);
void swap(int *a,int *b);
void sift_down(int a[],int s,int n);  
void sift_up(int a[],int s);
void heapSort(int a[],int n);
void visit(int a[],int n);
void insert(int a[],int elem,int *n); 
void hdelete(int a[],int i,int &n);

int main()
{
	int n,i;
	int a[MAX];
	
	FILE*fp;
	fp=fopen("F:\\Homework\\c\\123.txt","r");//資料來源於檔案
	
	printf("enter n:\n");
	scanf("%d",&n);
         
	for(i=1;i<=n;i++)   //從陣列‘1’位置開始
	 fscanf(fp,"%d",&a[i]);
	 	fclose(fp);
	
	visit(a,n); 	
	makeHeap(a,n); 
	heapSort(a,n);
        visit(a,n);
    
	return 0;
 } 
 
 void makeHeap(int a[],int n)
 {
 	int i;
 	
 	for(i=n/2;i>=1;i--) //從最後一個帶有子節點的父節點開始調整,直至根節點。
 	 sift_down(a,i,n);
 	 
 	 printf("Makeheap successfully!\n");
 }
 
 void swap(int *a,int *b) //交換兩個數
 {
 	int temp;
 	
 	temp=*a;
 	*a=*b;
 	*b=temp;
 }
 
//功能:對位置為s的節點進行向下調整
//s表示待調整的位置,n表示堆中元素的個數
 void sift_down(int a[],int s,int n) //
 {
 	int child=2*s;
 	int index;
 	while(child<=n)
 	{
 		if(child+1<=n)
 	     	a[child]>a[child+1]?index=child:index=child+1;
	    else
		    index=child;
		    
		if(a[s]<a[index])
	        {
		     swap(&a[s],&a[index]);
		     
		     if(index==child) /*********重要!!!********/ 
		        s=child;      
			 else
			 	s=child+1;
			
	       	 child=2*s;
			}
		else
		   return;	 
	 }
 }
 //功能:對位置為s的元素進行上調整
void sift_up(int a[],int s)
{
	while(s/2>=1)
	{
		if(a[s]>a[s/2])
		{
		 swap(&a[s],&a[s/2]);
		 s=s/2;
		}
		  
		else
		  break;
	}
 } 
 
void heapSort(int a[],int n)
{
	int i;
	
	for(i=n;i>=1;i--)
	{
		swap(&a[1],&a[i]);
		sift_down(a,1,i-1);
	}
	
	printf("sort successfully!\n");
 } 
 
void visit(int a[],int n)
{
	int i;
	
	for(i=n;i>=1;i--)
	printf("%d ",a[i]);
	
	printf("\nvisit all\n");
}
 
void insert(int a[],int elem,int *n)
{
   if(*n+1<=MAX)
   {
   	 (*n)++; 
   	 a[*n]=elem;
   	 
   	 sift_up(a,*n);
   	}	
   	
   	visit(a,*n);
} 

void hdelete(int a[],int i,int &n)
{
	swap(&a[i],&a[n]);
	n--;
	
	if(a[i]>a[n])
	  sift_down(a,i,n);
	else
	  sift_up(a,i);  
	
}