1. 程式人生 > >堆排序C語言程式碼

堆排序C語言程式碼

#include<stdio.h>
int heap_size;										//建堆時參與的元素個數
int parent(int i);									//三個節點關係函式
int left_child(int i);
int right_child(int i);
void max_heap(int *A,int i);						//維護最大堆性質
void build_maxheap(int *A);							//建立最大堆
int exchange(int *a,int *b);						
int get_length(int *A);								//獲取陣列中總的元素個數
int main()
{
	int i;
	int A[15]={17,86,8,111,48,44,99,1,24,68,34,19,96,33};

	heap_size=get_length(A);						//heap_size儲存要排序的元素的個數,在建堆時比陣列下標大1
	build_maxheap(A);

	for(i=heap_size-1;i>0;i--)						//heap_size是陣列中下標的最大值,即A[heap_size]是最後一個元素
	{
	exchange(A+i,A);								//將最大值交換到陣列末尾
	heap_size--;									//要處理的元素個數減1
	build_maxheap(A);								//維護剩餘元素最大堆的性質
	}

	for(i=0;i<get_length(A);i++)
	printf("%6d",A[i]);
}
void build_maxheap(int *A)
{
	int i;
	for(i=parent(get_length(A)-1);i>=0;i--)			//從最後一個節點的parent開始建堆
		max_heap(A,i);
}
void max_heap(int *A,int i)
{
	int l,r,largest;
	l=left_child(i);
	r=right_child(i);
	if(l<heap_size&&A[l]>A[i])						//為保證max_heap過程不會影響到已排序的部分,此處應判斷左孩子是否小於heap_size
		largest=l;
	else largest=i;
	if(r<heap_size&&A[r]>A[largest])
		largest=r;
	if(largest!=i)
	{
		exchange(A+i,A+largest);
		max_heap(A,largest);
	}
}

int parent(int i)
{
	return (i-1)/2;
}
int left_child(int i)
{
	return 2*i+1;
}
int right_child(int i)
{
	return 2*i+2;
}
int exchange(int *a,int *b)
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
	return 0;
}
int get_length(int *A)
{
	int len=0;
	while(A[len]!='\0')
	len++;

	return len;
}