数据结构----完全二叉树的时间复杂度讲解,堆排序

这篇具有很好参考价值的文章主要介绍了数据结构----完全二叉树的时间复杂度讲解,堆排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.建堆的时间复杂度

1.向上调整算法建堆

2.向下调整算法建堆

二.堆排序

1.概念

2.代码思路

3.代码实现


一.建堆的时间复杂度

1.向上调整算法建堆

我们就以极端情况考虑时间复杂度(满二叉树+遍历所有层)

数据结构----完全二叉树的时间复杂度讲解,堆排序,数据结构,算法

假设所有节点个数为N,树的高度为h

N = 2^0+2^1+2^2......+2^(h-1)

即N = 2^h - 1

h = log(N+1)

时间复杂度我们以交换次数为标准

1        0

2        2^0*2^1

3        2^1*2^2

...

h       2^(h-2)*2^(h-1)

F(h) = 2^0*2^1+2^1*2^2+...+2^(h-2)*2^(h-1)

       = 2^h*(h-2)+2

F(N) = (N+1)(log(N+1)-2)+2(这是详细的时间复杂度函数,粗略记为O(N*logN))

2.向下调整算法建堆

数据结构----完全二叉树的时间复杂度讲解,堆排序,数据结构,算法

1        (h-1)

2        2^1*(h-2)

3        2^2*(h-3)

...

h-1    2^(h-2)*1

h       2^(h-1)*0

找到倒数第一个非叶节点开始向下调整

F(h) = 2^h-1-(h-1)

F(N) = N-log(N+1)(粗略记为O(N))

二.堆排序

1.概念

堆排序(Heap Sort)是一种高效的排序算法,它利用了“二叉堆”这种数据结构来进行排序。
 
堆是一种特殊的树状结构,分为最大堆和最小堆。在最大堆中,每个父节点的值都大于或等于其子节点的值;而在最小堆中,每个父节点的值都小于或等于其子节点的值。
 
堆排序的基本思想是:将待排序的序列构建成一个最大堆,然后将最大值(即堆的根节点)与序列的最后一个元素交换位置,并将剩余元素重新构建为一个最大堆。重复这个过程,直到整个序列有序。
 
堆排序的时间复杂度为 O(n \log n),空间复杂度为 O(1)。它是一种不稳定的排序算法,适用于排序整数、浮点数或其他可比较的数据类型。
 
堆排序的优点包括:
 
1. 时间复杂度较低:堆排序的时间复杂度为 O(n \log n),在平均情况下比其他一些排序算法(如冒泡排序、插入排序)快得多。
2. 空间复杂度低:堆排序的空间复杂度为 O(1),它不需要额外的存储空间来保存排序后的结果,只使用了固定的辅助空间。
3. 适用于大型数据集:堆排序可以有效地处理大型数据集,因为它的时间复杂度和空间复杂度都比较低。
 
堆排序的缺点包括:
 
1. 不稳定:堆排序是一种不稳定的排序算法,这意味着在排序过程中可能会改变相同值元素的相对顺序。
2. 难以理解和实现:堆排序的概念和操作相对复杂,对于初学者来说可能比较难以理解和实现。
 
总的来说,堆排序是一种高效的排序算法,但在选择排序算法时需要根据具体情况考虑其优缺点。如果对排序的稳定性要求较高,则可能需要选择其他排序算法。

堆排序的平均性能为O(nlogn)。它的时间复杂度和空间复杂度都比较低,适用于排序整数、浮点数或其他可比较的数据类型。
 
在最坏情况下,堆排序的时间复杂度为O(nlog2n)。因此,堆排序的平均性能较接近于最坏性能。

2.代码思路

这里我们采用向下调整法

比如这里有一个大堆,要把它排成升序数组

 7 4 5 1 4 3

                s

首尾交换,把大数据放后面

 3 4 5 1 4 7

             s

让后向下调整,把下一个大数据调到堆顶

5 4 3 1 4 7

             s

首尾交换,把大数据放后面

4 4 3 1 5 7

         s

1 4 3 4 5 7

      s

4 1 3 4 5 7

      s

3 1 4 4 5 7

   s

1 3 4 4 5 7

s文章来源地址https://www.toymoban.com/news/detail-839613.html

3.代码实现

void adjustDown(HeapDataType* p, int size, int parent)
{
	int child = parent * 2 + 1;
	if (p[child] < p[child + 1])
		child++;
	while (child <= size)
	{
		if (child + 1 <= size && p[parent] < p[child])
		{
			Swap(&p[parent], &p[child]);
			parent = child;
			child = child * 2 + 1;
			if (p[child] < p[child + 1])
				child++;
		}
		else break;
	}
}
void heapSort(HeapDataType* p, int size)
{
	//建堆,一般采用向下调整法
	//向下调整法建堆的时间复杂度为O(N)
	//向上调整法时间复杂度为O(N*logN)
	for (int i = (size - 1 - 1) / 2; i >= 0; i--)
		adjustDown(p, size, i);
	//堆排序,升序用大堆,降序用小堆
	while (size > 0)
	{
		Swap(&p[0], &p[size - 1]);
		size--;
		adjustDown(p, size, 0);
	}
}

到了这里,关于数据结构----完全二叉树的时间复杂度讲解,堆排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】二叉树的顺序结构实现及时间复杂度计算(二)

    目录 一,二叉树的顺序结构实现         1,二叉树的顺序结构         2,堆的概念及结构         3,堆的接口实现 1,堆的创建 2,接口函数 3,初始化 4,销毁 5,是否增容 6,交换数据 7,堆向上调整算法 8,插入数据 9,删除数据 10,堆向下调整算法 11,打印数

    2024年02月09日
    浏览(37)
  • 【数据结构】二叉树的节点数,叶子数,第K层节点数,高度,查找x节点,判断是否为完全二叉树等方法

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 每一个节点有 1.数据

    2024年02月07日
    浏览(46)
  • 【数据结构】树、二叉树的概念和二叉树的顺序结构及实现

    之前我们学习了顺序表、链表以及栈和队列这些数据结构,但这些数据结构都是线性的(一对一)。接下来要学习 非线性的数据结构——树(二叉树) ,相比前面的,树的结构更加复杂,话不多说,直接进入正题吧。 树是一种 非线性的数据结构 ,它是 一对多(也有可能是

    2024年02月07日
    浏览(42)
  • 数据结构——二叉树的链式结构

      个人主页 : 日刷百题 系列专栏 : 〖C语言小游戏〗〖Linux〗〖数据结构〗  〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ 这里我们使用先序遍历的思想来创建二叉树,这里的内容对于刚接触二叉树的朋友可能有些难理解,不妨先看完下面的二叉树各种遍历

    2024年02月05日
    浏览(47)
  • 【数据结构】二叉树的链式结构

    学习链式二叉树要知道三种遍历方式,便于对二叉树的节点以及左子树和右子树进行操作。 前序遍历:根、左子树、右子树 中序遍历:左子树、根、右子树 后序遍历:左子树、右子树、根 以下图为例: 得到的结果: 前序遍历:1 2 3 4 5 6 中序遍历:3 2 1 5 4 6 后序遍历:3 2

    2024年02月08日
    浏览(57)
  • 数据结构:二叉树的链式结构

    朋友们、伙计们,我们又见面了,本期来给大家解读一下链式二叉树的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏 :数据结构与算法 个  人  主  页 :stackY、 C 语 言 专 栏 :C语言:从入门到精通 目录 前言

    2024年02月07日
    浏览(59)
  • 【数据结构】二叉树的介绍和二叉树堆

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖        树这一概念,在我们刚开始听说的时候会觉得

    2024年01月20日
    浏览(52)
  • 【数据结构—二叉树的链式结构实现】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、二叉树的存储结构 二、二叉树链式结构的实现 2.1手动构建一课树 2.2二叉树的遍历 三、二叉树链式结构的实现 3.1前序遍历(递归) 3.2中序遍历(递归) 3.3后序遍历(递归) 3.4层序遍历(非递

    2024年02月03日
    浏览(58)
  • 【数据结构】二叉树的概念及结构

    🚀write in front🚀 📜所属专栏: 初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!! 关注我,关注我,关注我 , 你们将会看到更多的优质内容!! 树是一种 非线性的数据结构

    2023年04月23日
    浏览(43)
  • 【数据结构】二叉树的顺序结构-堆

    普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而 完全二叉树 更适合使用顺序结构存储。 现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个

    2024年02月09日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包