自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 嵌入式历史与生态

将 CPU 核心、存储器(Flash、RAM)以及外设接口(GPIO、UART、SPI、I2C、ADC、Timer 等)集成在单一硅片上的单芯片微型计算机。

2026-11-02 14:27:14 540

原创 快速排序和归并排序

基本思想:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;基本思想:选取第一个为keyi,右边找到比a[keyi]小的就停,左边找到比a[keyi]大的就停,然后交换,相遇时,与a[keyi]交换,最后a[keyi]左边是比它小的,右边是比它大的。先确定左边第一个为key(坑位),右边开始走,找小,移到原坑位后,形成一个新坑位,左边再走,找大,移动坑位,形成新坑位,当左边与右边相遇时,即坑位,把key放进坑位。

2026-04-06 17:02:26 216

原创 插入排序和选择排序

直接插入排序:是一种简单的插入排序法,其基本思想是:把待排序的记录,按其关键码值的大小,逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。预排序(gap越大,大的可以越快跳到后面,小的数可以越快跳到前面,越不接近有序。gap>1时是预排序,gap==1时是直接插入排序。优化:从两边比较,既选出最大的,也选出最小的,放在两边,然后依次往中间收缩,直到到了中间就停止。本来是将第1个记为最小的,然后遍历,如果有更小的就交换,然后下一个记为最小的,依次类推。

2026-04-04 20:40:59 288

原创 排序:概览

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变。(即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;选择排序: O(n^2), O(1), 不稳定。归并排序: O(N*logN), O(N), 稳定。排序用于我们日常生活中,很常见的就是购物中价格的排序。4.归并排序:归并排序。

2026-04-04 20:19:16 26

原创 二叉树的遍历

2.若规定根节点的层数为1,则深度为h的二叉树的最大节点数是2^h-1,若节点数为n,那么h=log2(n+1).1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个结点。那么前序:1 2 3 n n n 4 5 n n 6 n n。中序:n 3 n 2 n 1 n 5 n 4 n 6 n。后序:n n 3 n 2 n n 5 n n 6 4 1。前序:访问根结点的操作发生在遍历其左右子树之前。中序:访问根结点的操作发生在遍历其左右子树中间。假设层序遍历为:1 2 4 3 5 6。

2026-03-28 17:41:43 168

原创 数据结构:堆

数据结构的堆和栈与操作系统的堆和栈不同。操作系统中的堆和栈是对内存区域的划分。a.完全二叉树 b.任何一个父亲大于等于孩子。a.完全二叉树 b.任何一个父亲小于等于孩子。大堆 70,50,30,25,15,10。小堆 10,15,56,25,30,70。//假设法(先假设左孩子小)大堆和小堆不一定有序。{//找出小的那个孩子。//建堆(向上调整)

2026-03-27 20:11:23 177

原创 数据结构:树

有一个特殊的结点,称为根结点,根节点没有前驱结点,除根结点外,其余结点被分成M(M>0)个互不相交的集合T1,T2......Tm,其中每一个集合Ti(1<=i<=m)又是一棵结构与树类似的子树,每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。对于深度为k的,有n个结点的二叉树,当且仅当每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时称为完全二叉树。双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点。孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点。

2026-03-21 19:50:08 40

原创 数据结构:队列

思路:使用两个栈,分别为pushst和popst,pushst里进数据,popst里出数据,将pushst里的数据先导入popst,再弹出。只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出(FIFO first in first out)思路:使用两个队列,保持一个存数据,一个为空,入数据入不为空的队列,出数据通过空的导一下。入队列:进行插入操作的一端称为队尾。出队列:进行删除操作的一端称为队头。队列相比栈在某些应用下更公平。可以尝试用队列实现栈。思考:设计循环队列。

2026-03-14 20:24:26 237

原创 数据结构:栈

栈中的数据元素遵守后进先出LIFO(last in first out)的原则。压栈(push):栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈(pop):栈的删除操作叫做出栈。

2026-02-07 22:24:51 495

原创 顺序表和链表补充

思路:先查找中间节点(也是使用快慢指针,不过现在是快指针一次走两步,慢指针一次走一步,快指针走完时,慢指针就到了中点),将中间节点后的节点逆序,然后与中间节点前的节点一一比较,当有一个指针指向NULL就结束(或者值不相等)。加载链表的数据时,后面一长段的数据大部分无效,会产生数据污染,缓存利用率低。(先计算差距步,长的链表,指针先走差距步,两个指针再同时走,第一个相等就是交点)链表没有容量的概率(按需申请释放)。思路:使用快慢指针,快指针先走k步,再同时走fast和slow指针(快慢指针的相对距离为k),

2026-02-07 19:25:38 157

原创 复杂度概括

F(N)=N^2+2*N+10 就是O(N^2) 2*N+10在N趋近于无穷时相比于N^2可以忽略不记,抓大头就只需要考虑N^2,这就是大O渐进表达法。算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,一个算法所花费的时间与其中语句的执行次数成正比,算法中的基本操作的执行次数,为算法的时间复杂度。F(N)=2*N+100 就是O(N)这里我们也不考虑N前面的系数.(系数影响小,可忽略)立方阶:O(n^3) 如:n^3+2n^2+4n+6。常见的空间复杂度:O(1)、O(N)、O(N^2)

2026-01-28 19:53:42 72

原创 顺序表和链表

从小点上可以分为带头/不带头、单向/双向、循环/不循环。结合起来总共2*2*2=8种,我们常说的单链表(不带头单向不循环链表)、双向链表(带头双向循环链表)。顺序表有一个应用就是我们常用的通讯录,一般功能包括初始化、销毁、插入(尾插、头插)、删除(尾删、头删)、查找、修改等,大家可以试试。链表也是线性表的一种,在物理结构上不是线性的,在逻辑结构上是线性的。链表是由一个一个的节点组成(包括数据和指向下一个节点的指针)。双向链表的结构(数据+指向下一个节点的指针+指向前一个节点的指针)

2026-01-13 23:04:24 304

原创 编译和链接

源文件.c 和 头文件.h -->预处理-->中间文件.i-->编译-->中间文件.s-->汇编-->目标文件.o 和 链接库libc.a -->链接器-->可执行文件。带有副作用的宏参数:当宏参数在宏的定义中出现超过一次的时候,如果参数有副作用,表达式求值会出现永久性效果。通常包括声明和类型的匹配,类型的转换等。运行环境:程序载入内存中,调用main函数,使用一个运行时的堆栈(stack),也可以使用静态(static)内存,终止程序。但宏是没法调试的,每次调用宏的时候,一份宏定义的代码将插入到程序中。

2025-11-24 16:19:24 611

原创 文件操作的理解

总结:程序通过打开文件,创建了一个和文件相关的流,为了维护流,同时创建了文件信息区,返回了一个文件指针,来找到文件信息区,流中的数据不是直接和文件交换,而是先放到缓存中再处理,以减少直接读写外部介质的次数,提高效率。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等),这些信息是保存在一个结构体变量中的。可以类比scanf.2.在读完文件后,需要继续写文件的时候,在写文件之前,使用fseek(),rewind()重新定位文件指示器的位置。

2025-11-22 16:32:21 945

原创 结构体的理解

struct S3的总大小为16个字节.首先double占8个字节,那么占据的内存单元从偏移量为0的地址处到偏移量为7的地址处,char占一个字节,可以紧接着放在偏移量为8的地址处,int占4个字节,那么不能放在偏移量为9,10,11的地址处(不是4的倍数),也就是浪费这三个空间,找到偏移量为12的地址处,一直占据到偏移量为15的地址处,总共16个字节。位段的几个成员共有同一个字节,内存中每个字节分配一个地址,一个字节内部的bit位是没有地址的。在声明结构的时候,可以不完全的声明。

2025-11-17 15:33:06 765

原创 字符函数、字符串函数、内存函数

strcmp 用来比较str1和str2指向的字符串,从两个字符串的第一个字符开始比较,如果两个字符的ASCII码值相等,就比较下一个字符,直到遇到不相等的两个字符或者字符串结束。memcmp 比较指定的两块内存块的内容,比较从ptr1和ptr2指针指向的位置开始,向后的num个字节,返回值与strcmp类似。strstr 查找str2指向的字符串在str1指向的字符串中第一次出现的位置(在一个字符串中查找子字符串)模拟实现:char*my_strcpy(char*dest,const char*src)

2025-11-16 10:44:01 568

原创 整数和浮点数在内存中的存储

规定:对于32位的浮点数(float):最高的一位存储符号位s,接着的8位存储指数E,剩下的23位存储有效数字M。对于64位的浮点数(double):最高的一位存储符号位s,接着的11位存储指数E,剩下的52位存储有效数字M。特别规定:我们知道计算机内部保存M的时候,默认M的第一位是1,因此可以舍去,只保存小数位,等读取时再把1加上去,所以可以保存24/53位有效数字。有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用0表示正,用1表示负,最高位的一位是被当做符号位,剩余的都是数值位。

2025-11-15 11:40:19 487

原创 指针的总结

指针变量的大小和类型是无关的,只要是指针类型的变量,在相同的平台下,大小都是相同的。我们现实生活中,以寝室为例,如果你想找到同栋的同学,你只需要知道他寝室的门牌号就行,这里门牌号就是编号,也表示同学所在的地址,在c语言中我们可以把指针理解为地址。硬件编址:32位机器有32根地址总线,每根线有两态,表示0,1(电脉冲有无),32根线能表示2的32次方种含义,每一种含义都代表一个地址。例:int*pa=&a int*合起来是pa的类型,*是在说明pa是指针变量,pa指向的对象是int类型的。

2025-11-09 10:53:43 446

原创 基本版扫雷游戏

接着打印一个9*9表格盘,这里需要用到for循环嵌套打印。我们知道扫雷游戏不仅需要找雷,如果遇到不是雷的地方还要显示周围8格雷的数量(以排查位置为中心,设为(x,y),将周围用x+1 x-1 x y+1 y y-1的组合坐标表示,然后相加表示总和,最后减去8*'0',得到的数+'0'就是表示相应的字符数字,显示数字到show里面),而当我们排查表格角落处,我们发现排查周围会超出我们表格的边界(也就是越界了)这时我们需要扩充表格盘为11*11(实际使用的还是9*9,就是在11*11中挖出一个9*9)。

2025-10-25 10:48:13 260

原创 c语言 分支和循环

假设有一个圆,我们将它分为不均等的三份(条件的范围一般不同),第一份我们可看作if的条件范围,第二份可以看作else if的条件范围,第三份是else的条件范围。switch表达式的值一旦满足某个case后面的常量,则会一直进行后面的case(不再判断值),但我们往往只需要一个case后面的语句,那么我们需要在case语句的末尾加break(也可根据逻辑要求判断是否加break),表示跳出switch语句。while(条件)如果满足条件(结果为真),就一直进行,直到不满足(结果为假),结束。

2025-10-18 10:58:33 432

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除