【資料結構】堆排序

pengfoo發表於2012-09-15

參考一篇文章:

http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html

另外,在下面的連結下還有動畫演示:

http://sjjp.tjuci.edu.cn/sjjg/DataStructure/DS/web/flashhtml/duipaixu.htm

 

下面是原始碼:

/*堆排序(大頂堆) 2011.9.14*/
#include<stdio.h>

void swap(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

void HeapAdjust(int *a,int i,int size)  //調整堆
{    
	int lchild=2*i;       //i的左孩子節點序號
	int rchild=2*i+1;     //i的右孩子節點序號
	int max=i;            //臨時變數
	if(i<=size/2)          //如果i不是葉節點就不用進行調整
	{       
		if(lchild<=size&&a[lchild]>a[max])
		{            
			max=lchild;
		}            
		if(rchild<=size&&a[rchild]>a[max])
		{            
			max=rchild;
		}        
		if(max!=i)
		{            
			swap(&a[i],&a[max]);
			HeapAdjust(a,max,size);    //避免調整之後以max為父節點的子樹不是堆
		}
	}
}

void BuildHeap(int *a,int size)    //建立堆
{    
	int i;
	for(i=size/2;i>=1;i--)    //非葉節點最大序號值為size/2
	{        
		HeapAdjust(a,i,size);
	}
} 

void HeapSort(int *a,int size)    //堆排序
{    
	int i;
	BuildHeap(a,size);
	for(i=size;i>=1;i--)
	{
		//cout<<a[1]<<" ";
		swap(&a[1],&a[i]);           //交換堆頂和最後一個元素,即每次將剩餘元素中的最大者放到最後面
		//BuildHeap(a,i-1);        //將餘下元素重新建立為大頂堆
		HeapAdjust(a,1,i-1);      //重新調整堆頂節點成為大頂堆
	}
}

int main(int argc, char *argv[])
{     
	//int a[]={0,16,20,3,11,17,8};
	int a[100];
	int size;
	int i;

	printf("給size賦值(1<=size<100):\n");
	scanf("%d",&size);   
	printf("輸入size個值給陣列:\n");	
	for(i=1;i<=size;i++)
		scanf("%d",&a[i]);
	HeapSort(a,size);
	printf("調整後的陣列為:\n");
	for(i=1;i<=size;i++)
		printf("%d ",a[i]);
	printf("\n");
	
	return 0;
}


 

相關文章