堆排序:利用堆实现的排序

堆排序

特点:

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据

重点!

排升序要建大堆,排降序建小堆

(升序)从小到大(降序)从大到小

1.建立小堆

void HeapBuilt(int* a, int n, int i)//建小堆
{
	int parent = i;
	int child = parent * 2 + 1;
	while (child < n)
	{
		//如果左子树比较小,并且child+1没有越界,child++
		if (child + 1 < n && a[child + 1] < a[child])
			child++;
		//如果子节点小于父节点,交换父子节点,并重新定义父子节点。
		if (a[child] < a[parent])
		{
			int tmp = a[parent];
			a[parent] = a[child];
			a[child] = tmp;

			parent = child;
			child = parent * 2 + 1;
		}
		else
			break;
	}
}

2.堆排序

void HeapSort1(int* a, int n)
{
	//从下向上初步建设堆。
	for (int i = (n - 2) / 2; i >= 0; i--)
	{
		HeapBuilt(a, n, i);
	}
	int end = n - 1;
	//选数,最后一个数和第一个数做交换,将最后一个数从数组中剔除,重新进行堆排。
	while (end > 0)
	{
		int tmp = a[0];
		a[0] = a[end];
		a[end] = tmp;
		HeapBuilt(a, end, 0);
		end--;
		
	}
}

代码结果:

在这里插入图片描述

堆排序特点

1.时间复杂度:O(N*logN)
2.空间复杂度:O(1)
3.稳定性:不稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值