首页 > 其他 > 详细

堆排序算法

时间:2014-02-02 19:07:58      阅读:444      评论:0      收藏:0      [点我收藏+]

堆排序算法

/*
 首先说一下堆的性质:
 1,它是一个完全二叉树
 2,每个节点的值小于等于左右孩子节点的
 值称为小根堆,反之为大根堆
 3,对于节点i,左孩子为2i,右孩子为2i+1
 (如果有的话)
 堆排序的思想:
 将待排序的序列构造成一个大根堆。此时,整个
 序列的最大值就是堆顶的根节点。将它与堆数组的
 末尾元素交换,此时末尾元素就是最大值,然后
 将剩余的n-1个序列重新构造成一个堆,如此反复
 就能得到一个有序序列。
 */
#include<cstdio>
#define MAX 1000

typedef struct SeqList
{
	int Array[MAX];
	int length;
}SeqList;

void Swap(SeqList *L,int i,int j)
{
	int temp=L->Array[i];
	L->Array[i]=L->Array[j];
	L->Array[j]=temp;
}

void HeapAdjust(SeqList *L,int s,int len)
{
	int temp,j;
	temp=L->Array[s];
	for(j=2*s;j<=len;j=j*2)
	{
		if(j<len&&L->Array[j]<L->Array[j+1])//如果左孩子<右孩子,记录右孩子
			j++;
		if(temp>=L->Array[j])//应该在S处插入
			break;
		L->Array[s]=L->Array[j];
		s=j;
	}
	L->Array[s]=temp;
}

void HeapSort(SeqList *L)
{
	int i;
	for(i=L->length/2;i>0;i--)
		HeapAdjust(L,i,L->length);//把Array构造成一个大根堆
	
	for(i=L->length;i>1;i--)
	{
		Swap(L,1,i);//与末尾元素交换
		HeapAdjust(L,1,i-1);//将剩余元素构造成一个大根堆
	}
}

int main(int argc,char *argv[])
{
	int i,n;
	SeqList L;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&L.Array[i]);
	L.length=n;
	HeapSort(&L);
	printf("After sort:\n");
	for(i=1;i<=L.length;i++)
		printf("%4d",L.Array[i]);
	printf("\n");

	return 0;
}


堆排序算法

原文:http://blog.csdn.net/u012736084/article/details/18896341

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!