数据结构与算法系列之堆排序

news/2025/5/22 9:26:23

在这里插入图片描述

💗 💗 博客:小怡同学
💗 💗 个人简介:编程小萌新
💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞

堆的概念和结构

如果有一个关键码的集合K = { , , ,…, },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: <= 且 <= ( >= 且 >= ) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
//堆中某个节点的值总是不大于或不小于其父节点的值;
//堆总是一棵完全二叉树

在这里插入图片描述

在这里插入图片描述

堆的实现

堆的向上调整

使用场景:建堆,堆的插入
建堆时间复杂度O( N*logN)

void AdjustUp(int* a, int child)
{int parent = (child - 1) / 2;while ( child > 0 ){if (a[parent] < a[child]){swap(&a[parent], &a[child]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

堆的向下调整

使用场景:建堆,堆的删除,堆的排序
建堆时间复杂度O(N)

void AdjustDown(int* a,int parent,int n)
{for(int child = parent * 2 + 1; child <n; child=child*2+1){if (child + 1 < n && a[child] <  a[child + 1]){child++;}if (a[child] > a[parent]){swap(&a[child], &a[parent]);parent = child;}else{break;}}
}

堆的创建和堆的排序

`void HeapSort(int* a, int n)
{int end = n - 1;//向上建堆for (int i =0 ; i < n; i++){AdjustUp(a, i);}//向下建堆/*for (int i = (end - 1) / 2; i >= 0 ;i--){AdjustDown(a, i, n);}*while (end>=1){swap(&a[0], &a[end]);AdjustDown(a, 0,end);end--;}
}

习题:求前K个最大或最小的元素(数量多的情况下)

void AdjustUp(int* a, int child)
{int parent = (child - 1) / 2;while ( child > 0 ){if (a[parent] > a[child]){swap(&a[parent], &a[child]);child = parent;parent = (child - 1) / 2;}else{break;}}
}void AdjustDown(int* a,int parent,int n)
{int child = parent * 2 + 1;for(int child = parent * 2 + 1; child <n; child=child*2+1){if (child + 1 < n && a[child]  > a[child + 1])//这里注意大小堆的区别 小堆选小 大堆选大{child++;}if (a[child] < a[parent]){swap(&a[child], &a[parent]);parent = child;}else{break;}}
}void HeapSort(int* a, int n,int k)
{int end = n - 1;//向上建堆int i = 0;for (i =0 ; i < k; i++){AdjustUp(a, i);}//向下建堆/*for (int i = (end - 1) / 2; i >= 0 ;i--){AdjustDown(a, i, n);}*///求前k个最大数建k次小堆,与小堆堆顶相比,//比堆顶大就向下调整while (i < n){if (a[0] < a[i]){swap(&a[0], &a[i]);AdjustDown(a, 0, k);}i++;}
}

在这里插入图片描述

文章来源:https://blog.csdn.net/zjy521_/article/details/131050570
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-4633535.html

相关文章

Java009——Java数据类型简单认识

围绕以下3点学习&#xff1a; 1、什么是Java数据类型&#xff1f; 2、Java数据类型的作用&#xff1f; 3、Java有哪些数据类型&#xff1f; 4、熟悉Java8大基本数据类型 一、什么是Java数据类型&#xff1f; 当我们写Java代码时&#xff0c;需要把数据保存在变量&#xff08;…

Customizable constraint systems for succinct arguments学习笔记(2)

微软研究中心Srinath Setty、a16z crypto research 和 Georgetown University Justin Thaler、Carnegie Mellon University Riad Wahby 20203年论文《Customizable constraint systems for succinct arguments》。 前序博客有&#xff1a; Customizable constraint systems f…

timm错误features_only not implemented for Vision Transformer models.

错误&#xff1a; 使用timm的ViT模型时 model timm.create_model(net, pretrainedTrue, features_onlyTrue) 出错&#xff1a;features_only not implemented for Vision Transformer models. 分析&#xff08;timm作者回复&#xff09;&#xff1a; the ViT models dont…

4.C++多线程-- unique_lock(类模板)

1.unique_lock 1. unique_lock<mutex> myUniLock(myMutex); 完全可以取代lock_guard 2. unique_lock 也可以使用----std::adopt_lock 3.使用adopt_lock&#xff0c;之前要先使用lock. 4.std::chrono::milliseconds my_sleepTime(20000)//20000毫秒 std::this_thread:…

SpringBoot源码分析:SpringBoot整合Tomcat(三)

一、概述 SpringBoot整合Tomcat整体启动流程如下图&#xff0c;接下来我们就按照改流程分析SpringBoot中内嵌Tomcat的启动流程。 二、启动流程 通过AbstractApplicationContext.refresh方法进入AbstractApplicationContext.onRefresh方法。 之后进入子类ServletWebServerAppl…

前端面试__谈谈你知道的DOM常见的操作(JavaScript)

目录 1. 什么是DOM 2. 有哪些操作 2.1 创建节点 2.1.1 createElement 2.1.2 createTextNode 2.1.3 createDocumentFragment 2.1.4 createAttribute 2.2 获取节点 2.2.1 querySelector 2.2.2 querySelectorAll 2.3 更新节点 2.3.1 innerHTML 2.3.2 innerText、text…

短视频矩阵源码技术开发

短视频矩阵是一种常见的视频编码标准&#xff0c;它通过将视频分成多个小块并对每个小块进行压缩来实现高效的视频传输。在本文中&#xff0c;我们将介绍短视频矩阵的原理和实现&#xff0c;并提供示例代码。 $where_time array(); // 时间 $where_time[] array(name>fbr…

Linux Shell脚本攻略

一、echo命令 1、在echo中转义换行符 默认情况下&#xff0c;echo会在输出文本的尾部追加一个换行符。可以使用选项-n来禁止这种行为。 echo同样接受双包含转义序列的双引号字符串作为参数。在使用转义序列时&#xff0c;需要使用echo -e "包含转义序列的字符串"这…

Unity基础框架从0到1(六)对象池模块

索引 这是Unity基础框架从0到1的第六篇文章&#xff0c;框架系列的项目地址是&#xff1a;https://github.com/tang-xiaolong/SimpleGameFramework 文章最后有目前框架系列的思维导图&#xff0c;前面的文章和对应的视频我一起列到这里&#xff1a; 文章 Unity基础框架从0到…

ChatGPT热度不减!华为宣布入局,盘古GPT能否大杀四方!

ChatGPT热度不减 六月份了&#xff0c;朋友们&#xff0c;来到六月份了已经&#xff0c;ChatGPT的热度依旧不减&#xff0c;各大论坛网站的榜单上还飘着ChatGPT相关话题的文章&#xff0c;且排名靠前。由此可见&#xff0c;这ChatGPT这股子热潮还得持续一段时间呢。 而且ChatG…