堆排序【模板】

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

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

这个堆排序模板是我基本完全按照《算法导论》里面自己一个字一个字的敲上去的,调试的时候修改了几个小地方: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);
		for (int j = 1; j <= 10; j++)
			printf("%d ", A[j]);
		printf("\n");
	}
}

//堆排序
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[11] = { 0, 5, 3, 2, 1, 4, 6, 9, 7, 8, 10 };
	//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 6 7 8 9 10

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值