初阶数据结构(C语言实现)——5.3 堆的应用(1)——堆排序

news/2025/3/15 1:58:59/

目录

  • 1 堆的应用
    • 1.1 堆排序
      • 1.1.1 思路
      • 1.1.2 代码实现
    • 1.2 建堆的时间复杂度
      • 1.2.1 向下调整
      • 1.2.1 向上调整
      • 1.2.3 结论

学习堆的应用之前,欢迎学习下堆。
这是博主之前的文章,欢迎学习交流

初阶数据结构(C语言实现)——5.2 二叉树的顺序结构及堆的实现
初阶数据结构(C语言实现)——5.1二叉树基础概念

1 堆的应用

1.1 堆排序

1.1.1 思路

堆排序即利用堆的思想来进行排序,总共分为两个步骤:

  1. 建堆
    升序:建大堆
    降序:建小堆
  2. 利用堆删除思想来进行排序
    建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。
    在这里插入图片描述

在这里插入图片描述

1.1.2 代码实现

void swap(HPDataType* p1, HPDataType* p2)
{HPDataType x = *p1;*p1 = *p2;*p2 = x;
}void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;//根据孩子位置,计算父亲位置while (child > 0)//child = 0,说明parent不存在了,已经到堆顶了{if (a[child] > a[parent]) //当孩子大小大于父亲大小的时候就交换{swap(&a[child], &a[parent]);//因为其他地方也要用到交换,封装了一个交换函数child = parent; //现在把父亲的值给孩子。parent = (child - 1) / 2;//继续计算现在节点的父亲结点,}else//孩子<=父亲 没必要往上走,直接break就行。		{break;}}
}
void AdjustDown(HPDataType* a, int n ,int parent)
{int child = parent*2+1;//根据父亲位置,计算孩子位置while (child <n)//走到没有孩子的时候,结束,{// 选出左右孩子中大的那一个if (child + 1 < n && a[child + 1] > a[child])//必须把child+1<n放前面,否则后面a[child+1]就越界了!{++child;}//交换if (a[child] > a[parent]){swap(&a[child],&a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
// 排升序 -- 建大堆void Heapsort(int* a, int n)//参数:数组和数据个数
{//建堆,方法1:向上调整堆 //模拟的是插入数据的过程for (int i = 1; i < n; ++i){AdjustUp(a, i);}//建堆,方法2:向下调整堆for (int i = 1; i < n; ++i){AdjustDown(a, n , i);}int end = n - 1;while (end > 0){swap(&a[end], &a [0]);AdjustDown(a, end, 0);--end;}
}

1.2 建堆的时间复杂度

1.2.1 向下调整

因为堆是完全二叉树,而满二叉树也是完全二叉树,此处为了简化使用满二叉树来证明(时间复杂度本来看的就是近似值,多几个节点不影响最终结果):

在这里插入图片描述

因此:向下建堆的时间复杂度为O(N)。

1.2.1 向上调整

在这里插入图片描述

因此向上建堆的时间复杂度是N*logn

1.2.3 结论

向下调整时间复杂度更小,更优,所以建堆使用的是向下调整


http://www.ppmy.cn/news/1579198.html

相关文章

用Python写一个算24点的小程序

一、运行界面 二、显示答案——递归介绍 工作流程&#xff1a; 1. 基本情况&#xff1a;函数首先检查输入的数字列表 nums 的长度。如果列表中只剩下一个数字&#xff0c;它会判断这个数字是否接近 24&#xff08;使用 abs(nums[0] - 24) < 1e-10 来处理浮点数精度问题&…

Haskell爬虫:为电商运营抓取京东优惠券的实战经验

一、需求分析&#xff1a;为什么抓取京东优惠券&#xff1f; 京东作为中国领先的电商平台之一&#xff0c;拥有海量的商品和丰富的优惠券资源。这些优惠券信息对于电商运营者来说具有极高的价值。通过分析竞争对手的优惠券策略&#xff0c;运营者可以更好地制定自己的促销方案…

如何利用Python爬虫获取微店商品详情数据:实战指南

微店作为知名的电商平台&#xff0c;提供了丰富的商品资源。通过Python爬虫技术&#xff0c;可以高效地获取微店商品的详情数据&#xff0c;用于数据分析、研究或其他用途。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;获取微店商品的详情数据&#xff0c;并确保爬虫…

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…

用 DeepSeek 构建 Vue.js 底层架构:高效协作与问题解决实践

文章目录 1. **DeepSeek 与 Vue.js 的完美协作**2. **问题背景**3. **问题分析与解决**3.1 **动态路由未正确生成**3.2 **路由路径配置错误**3.3 **路由嵌套问题**3.4 **通配符路由未配置** 4. **DeepSeek 的核心价值** 在现代前端开发中&#xff0c;Vue.js 以其简洁的语法和灵…

一个差劲的软件设计

项目概况&#xff1a; 之前自己设计并开发了一个用C#开发的上位机软件&#xff0c;整个软件只有一个Form&#xff0c;一个TabControl&#xff0c;3个TabControlPanel&#xff0c;总共100多个lable、textbox、ListBox等控件都放在这3个TabControlPanel里。 问题&#xff1a; 1.…

【Python】为什么要写__init__.py

文章目录 PackageA(__init__特性)应该往__init__.py里放什么东西&#xff1f;1、包的初始化2、管理包的公共接口3、包的信息 正常我们直接导入就可以执行&#xff0c;但是在package的时候&#xff0c;有一种__init__.py的特殊存在 引入moduleA.py&#xff0c;执行main.py&…

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中&#xff0c;休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏&#xff0c;不仅规则简单&#xff0c;还能锻炼思维。最近&#xff0c;我借助 DeepSeek 的帮助&#xff0c;开发了一款五子棋微信小程序。在这篇文章中&#xff0c;我将…