堆排序详解

我们学过很多排序,其实它们的很多效率其实不是很高,比如像冒泡排序之类的,接下来我们来介绍下什么是堆排序。

如果我们要排升序的话,我们要建大堆,说明如下:

 

 如图这是我们建好的大堆,但我们怎么去拍升序呢,不能重新开辟新的空间,我们是不是可以把80这一节点和最后这一节点换下。

 换完后,我们在可以向下调整,把53往下调,把比53大的往上调以此类推

 在把75和最后21换,最后排成了一个升序。代码如下

void AdjustUp(HPDtaType* a, int chlid)//向上调整
{
	int parent = 0;
	parent = (chlid - 1) / 2;
	while (chlid)//当chlid为零时,循环停止
	{
		if (a[parent] < a[chlid])//当孩子结点大于双亲结点时,就进行交换,
		{
			HPDtaType tmp = a[chlid];
			a[chlid] = a[parent];
			a[parent] = tmp;
			chlid = parent;
			parent = (chlid - 1) / 2;
		}
		else
		{
			break;
		}
	}
}
void Adjustdown(HPDtaType* a, int n, int partent)//向下调整
{
	int chlid = 0;
	chlid = partent * 2 + 1;
	while (chlid < n)
	{
		if (chlid + 1<n&&a[chlid + 1] > a[chlid])
		{
			chlid++;
		}
		if (a[chlid] > a[partent])
		{
			Swap(&a[chlid], &a[partent]);
			partent = chlid;
			chlid = partent*2+1;
		}
		else
		{
			break;
		}
	}
}
void Swap(HPDtaType*px, HPDtaType*py)//交换接口
{
	HPDtaType tmp = *px;
	*px = *py;
	*py = tmp;
}

以上使我们所要用到的接口函数

#include"HeapSort.h"
int main()
{
	int a[] = { 10, 12, 54, 33, 21, 60, 75, 70, 43, 53, 80 };
	int sz = sizeof(a) / sizeof(a[0]);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");

	for (int i = 1; i < sz; i++)
	{
		AdjustUp(a, i);//建大堆
	}
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	for (int end = sz - 1; end >= 0; end--)
	{
		Swap(&a[end], &a[0]);
		Adjustdown(a, end, 0);
	}
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

这是我们最后的测试函数

 这是我们最后的结果,得到了升序

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值