您的位置:首页 > 其它

堆排序【模板】

2013-10-30 11:42 211 查看
很认真地看完了《算导》的排序之前的所有部分,除了算法复杂度那一章的数学要求太高,难以完全驾驭以外,其他的部分还是很好理解的。。。

争取把《算导》里面出现的算法都自己实现,***自己的模板,以后好用。。。堆排序虽然在一般的时候是没有快排好用,但是在优先队列里面很好用,所以也是很有力的武器!

这个堆排序模板是我基本完全按照《算法导论》里面自己一个字一个字的敲上去的,调试的时候修改了几个小地方:1.heapsize,开始我准备写一个函数的,但是因为在sort函数里面要执行自减操作,所以必须要用全局变量才好处理;2.《算导》里面是从数组下标的1开始的,所以我在赋初值的时候将 A[0] 跳过了

#include <iostream>

//堆长度
int heapsize;

//大顶堆化
void MAX_HEAPIFY(int A[],int i)
{
	int l=2*i;		//把 i 的左儿子 下标 赋给l
	int r=2*i+1;		//把 i 的左儿子 下标 赋给r
	int largest;	//3个里面最大的下标

	if(l<=heapsize && A[l]>A[i])
		largest=l;
	else
		largest=i;

	if(r<=heapsize && A[r]>A[largest])
		largest=r;

	if(largest!=i)
	{
		//交换 A[largest] 和 A[i]
		int tmp=A[largest];
		A[largest]=A[i];
		A[i]=tmp;

		MAX_HEAPIFY(A,largest);
	}
}

//建堆
void BUILD_MAX_HEAP(int A[])
{
	int i;
	for(i=(int)(heapsize/2);i>=1;i--)
		MAX_HEAPIFY(A,i);
}

//堆排序
void HEAPSORT(int A[])
{
	BUILD_MAX_HEAP(A);		//ok

	int i;
	int tmp;
	for(i=heapsize;i>=2;i--)		//A[1] 必定是最大的
	{
		//交换 A[1] 和 A[i]
		tmp=A[1];
		A[1]=A[i];
		A[i]=tmp;

		heapsize--;
		MAX_HEAPIFY(A,1);
	}
}

int main()
{
	int A[6]={0,5,3,2,1,4};
	//ok
	int n=sizeof(A)/sizeof(int)-1;
	heapsize=n;

	HEAPSORT(A);

	for(int i=1;i<=n;i++)
		printf("%d ",A[i]);

	return 0;
}


运行结果为:

1 2 3 4 5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: