IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据结构】堆排序 -> 正文阅读

[数据结构与算法]【数据结构】堆排序

堆排序

  • 因为大堆和小堆只能知道最大元素和最小元素

  • 而TopK也只能找出前k个大/小的元素

这一篇,同时满足上面两个求

本篇有大量内容在前两篇文章基础上:

以及很多代码的接口/函数之前写过不再重复:



一、思路

1. 建小堆

排序按从小到大排序,我们可能先需要一个小堆

调整堆的顺序有两种操作方式,向上调整和向下调整

向上调整建小堆:

在这里插入图片描述

类似于之前在堆后插入一个数,然后进行向上调整

//堆排序
void Heapsort(int* a, int n)
{
	int i = 0;
	for (i = 1; i < n; i++)
	{
		AdjustUp(a, i);
	}
}

向下调整建小堆:

在这里插入图片描述

调整每一个非叶子节点,将其变成小堆,多个小堆在一起,也就是小堆了

最后一个叶子节点就是最后一个节点的父节点

//向下调整
int i = 0;
for (i = (n - 2) / 2; i >= 0; i--)
{
		AdjustDown(a, n, i);
}

然后就发现,建了一个小堆,再往下操作只能是后面n - 1再进行建堆……这也太麻烦了

变换思路,改建大堆


2. 建大堆

根据之前,pop堆顶元素的原理

在这里插入图片描述

先把最后一个元素和根交换,再pop掉原来的根,新的根进行向下调整

这里我们不pop掉原来的根,进行向下调整的堆变成前n-1个数的堆里向下调整

在这里插入图片描述

for (i = 0; i < n; i++)
{
	swap(&a[0], &a[n - 1 - i]);
	AdjustDown(a, n, i);
}

3. 测试代码

//堆排序
void Heapsort(int* a, int n)
{
	向上调整
	//int i = 0;
	//for (i = 1; i < n; i++)
	//{
	//	AdjustUp(a, i);
	//}

	//向下调整
	int i = 0;
	for (i = (n - 2) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

	for (i = 0; i < n; i++)
	{
		swap(&a[0], &a[n - 1 - i]);
		AdjustDown(a, n - i - 1, 0);
	}
}

//测试堆排序
void testsort()
{
	int n = 7;
	int a[7] = { 1, 5, 6, 2, 4, 6, 7 };
	Heapsort(a, n);

	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");

}

int main()
{
	testsort();

	return 0;
}

测试结果:

在这里插入图片描述

可以看出数组变成升序了


二、证明时间复杂度

1. 建堆过程

小堆为例,最坏的情况就是下面全是大的

在这里插入图片描述

  • 1层,20 个节点,需要向下移动h-1
  • 2层,21 个节点,需要向下移动h-2
    ……
  • h-1层, 2h-2 个节点,需要向下移动1
  • 最后一层不用动

T(n) = 20 * (h-1) + 21 * h-2 + …… + 2h-2 * 1

利用高中等差x等比形式的求和,错位相减法

在这里插入图片描述

建堆的时间复杂度为O(n)


2. 向下调整过程

向下调整时间复杂度为o(n),一共n个数

所以是nlog2(n)


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:50:47  更:2021-11-12 19:50:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:28:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码