排序——堆排序

  以下是自己写的堆排序源码,已经测试通过,以后有时间总结,

#include<stdio.h>
//堆a,存储在数组a[len]中,根节点下标为i,len为数组长度 
//该函数的作用是保持最大堆的性质 
void Keep(int *a,int len,int i);
void Build(int* a,int len);
void Sort(int* a,int len);
void Keep(int *a,int len,int i)
{
	int left=2*i+1;
	int right=2*i+2;
	int largest=i,temp;
	if(left<len&&a[left]>a[i])
		largest=left;
	if(right<len&&a[right]>a[largest])
		largest=right;
	if(largest!=i)
		{
			temp=a[i];
			a[i]=a[largest];
			a[largest]=temp;
			Keep(a,len,largest);
	}
} 
//建堆:通过一个数组建立最大堆
void Build(int* a,int len)
{
	int i;
	for(i=len/2-1;i>=0;i--)
		Keep(a,len,i);
}
//堆排序
void Sort(int* a,int len)
{
	int temp,i;
	Build(a,len);
	for(i=len-1;i>=1;i--)
	{
		temp=a[i];
		a[i]=a[0];
		a[0]=temp;
		printf("%d %d\t",a[0],a[i]);
		len--;
		Keep(a,len,0);	
			
			
	}	
	printf("\n");
}
int main()
{
	int len=10;
	int a[len];
	for(int i=0;i<len;i++)
		scanf("%d",&a[i]);
	Build(a,len);
	Sort(a,len);
	for(int i=0;i<len;i++)
		printf("%d ",a[i]);
	
	
	
return 0;	
}

  

posted @ 2016-04-14 13:34  LT.C#  阅读(232)  评论(0编辑  收藏  举报