数据结构与算法
文章平均质量分 77
.在本专栏中,将用C学习初阶的数据结构 —— 时间、空间复杂度、顺序表、链表、栈、队列、二叉树、排序。而高阶的数据结构将用C++学习 —— string、vector、list、stack、queue、二叉搜索树、AVL树、红黑树、map等
跳动的bit
这个作者很懒,什么都没留下…
展开
-
数据结构和算法之排序总结
一、排序的概念及应用???? 排序的概念???? 排序的运用???? 常见的排序算法二、常见排序算法的实现???? 插入排序1、直接插入排序2、希尔排序???? 选择排序1、直接选择排序2、堆排序???? 交换排序1、冒泡排序2、快速排序???? 归并排序???? 非比较排序1、计数排序2、基数排序???? 文件排序 (拓展)???? 性能测试三、排序算法复杂度及稳定性分析四、概念选择题原创 2021-12-28 11:06:29 · 6104 阅读 · 4 评论 -
文件排序 (拓展)
⚠ 注意 小文件排序是没有意义的,当然我们这里只是模拟,所以给 100 个数据???? 核心思想 ???? 磁盘的读取速度相比内存差距非常大,所以我们不可能像在内存中两两归并。正确的归并方法是大文件平均分割成 N 份,保证每份大小都可以加载到内存,那么就可以把每个小文件加载到内存中,使用快排排序,再写回小文件,这时就达到文件中归并的先决条件???? 实现代码 :void _MergeFile(const char* File1, const char* File2, const char*原创 2021-12-10 10:02:34 · 3796 阅读 · 7 评论 -
非比较排序 (计数排序 && 基数排序)
一、计数排序 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 计数排序核心步骤: 1️⃣ 统计相同元素出现次数 2️⃣ 根据统计的结果将序列回收到原来的序列中原创 2021-12-09 08:12:02 · 16324 阅读 · 15 评论 -
归并排序 (递归 && 非递归)
归并排序 (MERGE-SORT) 是建立在归并操作上的一种有效的排序算法,该算法是采用分治法 (Divide and Conquer) 的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤:❗ 动图演示:❕???? 实现代码 —— 递归版 :void _MergeSort(int* a, int left, int right, i原创 2021-12-06 07:15:46 · 20734 阅读 · 20 评论 -
交换排序 (冒泡排序 && 快速排序)
1、冒泡排序???? 核心思想 ???? 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。❗ 冒泡排序的特性总结:❕ 1️⃣ 冒泡排序是一种非常容易理解的排序 2️⃣ 时间复杂度:O(N^2) 3️⃣ 空间复杂度:O(1) 4️⃣ 稳定性:稳定❗ 动图演示:❕???? 实现代码 :void Swap(int* px, int* py){ int temp =原创 2021-11-29 07:45:35 · 28712 阅读 · 50 评论 -
选择排序 ( 直接选择排序 && 堆排序 )
1、直接选择排序???? 核心思想 ???? 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。❗ 过程:❕ 1️⃣ 在元素集合 array[i] - array[n-1] 中选择关键码最大 (小) 的数据元素 2️⃣ 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换 3️⃣ 在剩余的 array[i] - array[n-2] (array[i+1]–array[n-1]) 集合中,原创 2021-11-25 06:37:59 · 24181 阅读 · 23 评论 -
插入排序 ( 直接插入排序 && 希尔排序 )
1、直接插入排序???? 核心思想 ???? 把待排序的记录按关键码的大小逐个插入到一个已经排好的序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列实际中我们玩扑克牌时,就用了插入排序的思想❗ 过程:❕当插入第 i(i>=1) 个元素时,前面的 array[0], array[1], … , array[i-1] 已经排好序,此时用 array[i] 的排序码与 array[i-1], array[i-2],… 的排序码顺序进行比较,找到插入位置即将 array[i] 插入,原创 2021-11-22 08:02:33 · 15639 阅读 · 18 评论 -
仅不到五万字轻松了解二叉树和堆
文章目录前言一、树概念及结构???? 树的概念???? 树的相关概念???? 树的表示???? 树在实际中的运用 (表示文件系统的目录树结构)二、二叉树概念及结构???? 二叉树的概念???? 特殊的二叉树???? 二叉树的性质???? 二叉树的概念选择题???? 二叉树的存储结构三、二叉树顺序结构及实现???? 二叉树的顺序结构???? 堆的概念及结构???? 堆的概念选择题???? 堆的实现1、堆向下调整算法2、堆的创建3、堆的时间复杂度4、堆的插入5、堆的删除6、堆的代码实现???? 堆的应用1、堆排原创 2021-10-24 07:59:53 · 88906 阅读 · 29 评论 -
内功修炼《函数栈帧的创建和销毁》建议收藏
文章目录前言一、寄存器???? 寄存器的概念???? 通用寄存器的结构???? 指针寄存器和变址寄存器前言在前期的学习过程中,我们可能会有很多的困惑:1️⃣ 局部变量是怎么创建的?2️⃣ 为什么局部变量的值是随机值?3️⃣ 函数是如何传参的?以及传参的顺序是怎样的?4️⃣ 形参和实参是什么关系?5️⃣ 函数调用是怎么做的?6️⃣ 函数调用结束后是怎么返回的?⚠ 这里使用的环境是 Visual Studio 2017 ,提示不要使用太过高级的编译器,因为越高级的编译器越不容易观察。同时这里需原创 2021-09-20 07:43:57 · 20502 阅读 · 101 评论 -
爆肝两万字,我爷爷都看的懂的《栈和队列》,建议各位观众姥爷先收藏
文章目录一、栈???? 栈的概念及结构???? 栈的实现二、队列???? 队列的概念及结构???? 队列的实现三、栈和队面试题四、概念选择题???? 1???? 2一、栈???? 栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称库栈底。栈中的数据元素遵守后进先出LIFO (Last In First Out) 的原则栈有两个经典的操作1️⃣ 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。2️⃣ 出栈:栈的删除操原创 2021-09-12 08:13:14 · 79430 阅读 · 156 评论 -
南方的朋友请回避一下,我给北方的朋友介绍一下我们南方的臭豆腐 ——《带头双向循环链表》
文章目录一、链表各接口的实现一、链表各接口的实现原创 2021-08-29 09:35:02 · 71636 阅读 · 195 评论 -
复制带随机指针的链表<难度系数⭐⭐>
???? 题述:给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。 深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复原创 2021-08-26 07:17:01 · 67057 阅读 · 140 评论 -
链表学会了没,会做这些题就足够了,思路全在动图里了,不懂直接剁手《下篇》
1.分割链表<难度系数⭐⭐>???? 题述:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序 (相对顺序不变),返回重新排列后的链表的头指针。???? 示例1:输入:head = [1,4,3,2,5,2], x = 3输出:[1,2,2,4,3,5]???? 示例2:输入:head = [2,1], x = 2输出:[1,2]???? 平台:Visual studio 2017 &&原创 2021-08-22 10:33:07 · 67936 阅读 · 151 评论 -
链表学会了没,会做这些题就足够了,思路全在动图里了,不懂都难《上篇》
1.移除链表元素 <难度系数⭐>???? 题述:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。???? 示例1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]???? 示例2:输入:head = [ ], val = 1输出:[ ]???? 示例3:输入:head = [7,7,7,7], val = 7输出:[ ]???? 平台:Visua原创 2021-08-18 09:19:08 · 30749 阅读 · 122 评论 -
看完这篇文章还不会顺序表和链表,请寄刀片给我
文章目录一、线性表二、顺序表???? 顺序表的概念和结构???? 接口实现三、链表四、顺序表和链表的区别和联系一、线性表线性表(linear list )是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。二、顺序表???? 顺序表的概念和结构顺序表是用一段物理地址连续的存储单元原创 2021-08-12 19:09:07 · 18201 阅读 · 106 评论 -
时间复杂度和空间复杂度(C站最详细的)
文章目录一、算法效率???? 如何衡量一个算法的好坏???? 算法的复杂度二、时间复杂度???? 什么是时间复杂度???? 大O渐进表示法 (估算)???? 常见的时间复杂度计算举例三、空间复杂度一、算法效率???? 如何衡量一个算法的好坏????递归代码 ———— 斐波那契数列的代码量十分简洁,所以这个算法是很优的?但其实使用递归是非常戳的,你会发现递归去计算第40位斐波那契数时都要跑半天,究其原因是内部产生大量重复的计算。那该如何去衡量算法的优劣呢?#define _CRT_SECURE_NO_原创 2021-07-30 07:30:31 · 20536 阅读 · 75 评论