堆排序(c语言)


前言

堆排序的效率在各种排序中也是比较高的效率了,时间复杂度为O(nlog2n)


一、堆排序实现

实现堆排序首先我们要先建堆,而排序有升序和降序;
要排 升序我们要建大堆要排降序我们要建小堆
升序建大堆的原因是根节点是最大的,每次我们让最后一个与根进行转换,这时我们的堆改变了,最后一个变成最大数了,这时我们忽略最后一个最大数对堆进行调整,再次变成大堆,依次操作我们就可以得到一个升序的堆;
降序道理差不多;

如何建堆:
我们要知道,建堆实际上是对数组进行处理并不是真正意义上的建堆。
如我们有这样一个数组:

int a[] = {15,1,19,25,8,34,65,4,27,7};

我们用向下调整建堆—就是找最后一个不是叶子节点的节点与其子节点进行比较,看情况进行转换,建大堆让这个节点与其孩子节点最大的进行转换,建小堆就让这个节点与其孩子节点最小的进行转换;

if (minchilen + 1 < n && p[minchilen] < p[minchilen + 1])
		{
			minchilen++;
		}
		if (p[parent] < p[minchilen])
		{
			swap(&p[parent], &p[minchilen]);
			parent = minchilen;
			minchilen = parent * 2 + 1;
		}
		

这里我们让两个孩子节点进行比较,让大的与节点进行比较,建的是大堆
在这里插入图片描述

此时我们通过调试发现堆已经建好了;

然后根据上面提供的思路我们转换最后一个节点和根节点进行排序

    int i = 1;
	while (i < n)
	{
		swap(&a[0], &a[n - i]);
		Adjustdown(a, n - i, 0);
		i++;
	}

在这里插入图片描述

二、具体代码

#include<stdio.h>
void Adjustdown(int* p, int n, int parent)
{
	int minchilen = parent * 2 + 1;
	while (minchilen < n)
	{
		if (minchilen + 1 < n && p[minchilen] < p[minchilen + 1])
		{
			minchilen++;
		}
		if (p[parent] < p[minchilen])
		{
			swap(&p[parent], &p[minchilen]);
			parent = minchilen;
			minchilen = parent * 2 + 1;
		}
		else
			break;
	}
}

void swap(piledata* a, piledata* b)
{
	piledata tmp = *a;
	*a = *b;
	*b = tmp;
}
int main()
{
	int a[] = {15,1,19,25,8,34,65,4,27,7};
	int n = sizeof(a)/sizeof(a[0]);
	for (int i = (n - 1 - 1) / 2;i>=0; i--)
	{
		Adjustdown(a,n,i);
	}
	int i = 1;
	while (i < n)
	{
		swap(&a[0], &a[n - i]);
		Adjustdown(a, n - i, 0);
		i++;
	}
	return 0;
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思瑞思拜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值