【数据结构】堆排序

参考一篇文章:

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;
}


 

你可能感兴趣的:(【数据结构】堆排序)