加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 安全 > 正文

【数据结构】堆排序

发布时间:2021-05-22 11:35:21 所属栏目:安全 来源:网络整理
导读:参考一篇文章: 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*/#

参考一篇文章:

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

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读