堆排序详解

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

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

 

 如图这是我们建好的大堆,但我们怎么去拍升序呢,不能重新开辟新的空间,我们是不是可以把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;
}

这是我们最后的测试函数

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>