- 博客(29)
- 收藏
- 关注
原创 C++初阶-C++的讲解1
引用是给一个变量取别名,而不是新定义一个变量,也不需要新开辟一块空间,引用的变量和被引用的变量共用同一块空间,如:林冲的别名是豹子头,我们可以叫林冲为豹子头,也可以叫他林冲。引用的写法:int a=0;int& b=a;这个b就是a的别名。其中b的类型还是为int相当于&的前面的变量类型就是引用变量的类型。这章内容有点上难度了,但是总体来说理解不是很难,主要掌握引用的用法就可以了,其他的不是太大的问题。喜欢的可以一键三连哦,下次再见!
2025-04-09 22:13:57
693
4
原创 C++初阶-C++入门基础
C++是在1997年发布的第一个成熟版本,C++是由Bjame Stroustrup(中文翻译为本贾尼·斯特劳斯特卢普)觉得C语言有太多限制而想出来改变的一个改进的语言,现在公司主要用的是C++98和C++11版本的,C++三年更新一次,下一次更新是在2026年。C++开始涉及一个点就需要引申到另外一个点,所以思维连贯性较强,这一节不是很难,但是也需要去理解基本用法,下一节就有点难度上升了哦,下讲再见!喜欢的可以一键三连哦!
2025-04-09 20:20:36
968
1
原创 排序扩展-文件递归排序(外排序)
外排序是能够处理极大量数据的排序算法,简单来说,外排序处理的数据就是不能一次性装入内存,只能放在读写较慢的外存储器上(一般是硬盘上),外排序通常采用的是一种“排序-递归”的策略。在排序阶段,先读入能放在内存中的数据量,将排序输出到一个临时文件,依次进行,将待排序数据组织为多个有序的临时文件,然后在归并阶段将这些临时文件组合为一个大的有序文件,即排序结果。这就是全部的结果了,代码的运行结果我就没办法提供了,因为这个不是必须要掌握的,代码和结果不重要,只要知道如何实现的就可以了。
2025-04-07 20:39:14
171
2
原创 归并排序延伸-非递归版本
其次我们还需要考虑数组为非偶数的情况,因为我们不能平分数组,所以我们需要额外来考虑这种情况,如果为含有奇数个元素的数组,则会导致最后一个组第二层循环结束时只有一个元素,这时begin2>=n或者加begin2==end2就直接跳出循环,而之后如果遇到begin2==n-1,end2又越界了,我们不能结束循环,因为我们需要来进行排序的,所以我们让end2=n-1这样就不会越界了,至于什么是begin1 end1 begin2 end2。
2025-04-02 20:59:15
436
1
原创 *快排延伸-自省排序
自省排序的思路是自我侦测和反省,快速排序如果递归深度太深,其算法的效率可能被大幅度削弱,这就需要借助其他的算法进行排序了,所以我们需要把之前所有算法都要使用上,至于思想大家可以去搜搜资料,这个算法的代码过长,所以实现起来很麻烦,但是算法思路我之前都已经讲过,里面有些难以理解的地方,这只是一个代码分享的过程,没必要追究如何得到的这个结论,我只在适当地方进行注释。我改变的代码在第465行。
2025-04-02 20:06:48
155
2
原创 快速排序的深入优化-三路划分
三路划分算法解析:当面对大量跟key相同的值的时候,三路划分就有关键的优势了,它的思想有点类似于hoare的左右指针和lomuto前后指针的结合。(2)left指向区间最左边,right指向区间最右边,cur 指向left+1的位置(3)当cur遇到比key小的值的时候该数据和left交换,left++,cur++;(4)当cur遇到比key大的值的时候跟right位置的数据交换,right--,我们可以用随机选key的方式来解决这些问题,如:key=rand()%(right-left+1)+left。
2025-04-01 18:29:09
330
原创 排序算法4-归并排序、非比较排序
排序算法是生活中常用的算法,学好它很重要,每一个算法都有他们自己的优势和适用地方,如:快速排序在对于已经排好序的数组会表现出过高的复杂度,而一些重复数据也可能导致快速排序算法的时间复杂度升高,但是这个快速排序只针对那些我们已经学过的,其他的算法就不一定了。至此,所有数据结构的知识已经全部讲完,下节我将开始讲解C++入门,我暂时还没开始学C++,所以下一篇可能需要下周才能更新了,喜欢的话可以一键三连哦!
2025-03-31 18:32:13
274
2
原创 排序算法3-交换排序
快速排序的实现方式有很多种,以后我们学习了C++等可能有更好的排序算法,总体来说快速排序的运行时间较短,是一个好的算法,非常建议大家在实战中使用该算法!下节我准备把归并排序和非比较排序直接讲了,就不和其他的算法进行比较了,只要知道这个算法就可以了,喜欢的可以一键三连哦,下节再见!
2025-03-31 12:40:01
1375
1
原创 排序算法1--插入排序
插入排序理解和实现相对简单,但是之后的排序相对于这个排序更好一些,所以还要多知道一些排序算法更好一点,我们遇到的题目很多,我们也要很多的手段来应对每一种题目,所以继续加油吧!
2025-03-29 16:25:11
837
1
原创 数据结构初阶-二叉树的应用
这些题目难度都还行,只要虚心学习,不断在自己思考的情况下,这些题目还是很容易的。喜欢的可以一键三连哦,下节将讲解:排序1。
2025-03-24 09:41:29
791
1
原创 数据结构初阶-堆的代码实现
堆这个数据结构实现起来比较难,日后需要不断去强化这方面的知识。喜欢的可以一键三连哦,下节讲解:二叉树的链式实现。
2025-03-10 09:39:04
1051
3
原创 数据结构初阶-栈和队列的应用1
出栈比较复杂,由于出栈是最后一个入栈的元素,所以应当先对空队列进行插入操作,把另外一个队列里面的前面保存的所有数据插入至空队列里面,并且在这个非空队列进行出队操作,直至最后一个元素为止。题目链接:https://leetcode.cn/problems/implement-stack-using-queues/description/题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/description/
2025-02-19 22:07:36
355
原创 数据结构初阶-队列
概念:只允许在以一端进行插入数据的操作,只允许在另外一端进行删除数据的操作,其中插入数据的一端称为队尾,删除数据的一端称为队头,删除数据被称为出队列,插入数据称为入队列。所以我们可以称队列具有先入先出的特点,我们可以理解为我们去食堂等地方去排队时,先来的人先出去,而后来的人只能从最后进行往前走。但是我们需要的是结点的结构,所以这个结点包括:所存储的数据data,一个包含下一个结点的next指针。队列相对于之前的知识比较简单,下章将讲队列的应用,喜欢的可以一键三连(代码记得保存,下节课要用)。
2025-02-17 21:43:42
398
原创 数据结构初阶-栈及其应用
结构:和顺序表一样(不知道的看我之前的博客),包含一个数组指针,用来存储数据,包含一个整型变量size,用来保存栈所含的数据个数,包含一个整型变量capacity用来保存栈所能存储的数据的个数,相当于一个栈的空间所能存储的最大数据个数,因为我们的内存空间一直都是自己申请的,如果不够就需要继续申请,所以我们需要判断是否够,而如果不够的时候即为size=capacity,而每次我们申请的空间是原有空间的两倍,如果没有则初始化为能存储4个数据的空间。题目思路:如果为左括号,就入栈,如果为右括号,就出栈。
2025-01-19 12:42:37
497
1
原创 数据结构初阶-双向链表
为结构体,其中包含一个指针指向下一个结点的结构体指针next,一个指针指向上一个结点的指针prev,还有所存储的数据data,由于存储的数据类型未知,所以我们typedef int LTDataType;若结果为8 -> 6 -> 4 -> 2 -> 3 -> 1 -> 2 -> 3 -> 4 ->则代码无误,如果感兴趣的话也可以写一个在pos位置之前插入数据的函数。如果结果为8 -> 6 -> 4 -> 2 -> 3 -> 1 -> 2 -> 3 -> 4 ->//存储下一个结点的地址。
2025-01-17 12:26:05
501
1
原创 数据结构初阶-单链表题目2
这种方式是最简单的一种方式,具体代码可以参考之前我们写过的题目链接:https://leetcode.cn/problems/reverse-linked-list/description/的代码中的函数返回值来写这个题目(看我上一篇博客)这个方式需要的知识较多,感兴趣的可以尝试一下,具体的还是得靠自己完成,我只提供思路。3.我们需要把random指针也赋值给新结点,但是我们要注意:我们需要一个指针一直在原链表上面,而新链表的random的指针一直在被赋值,所以我们需要一个指针一直在原链表上面。
2025-01-17 10:28:03
439
1
原创 数据结构初阶-单链表题目1
我们发现代码过长的原因就是我们每次都要判断链表是否为空的情况,如果我们一定确定了链表不为空就好了,所以我们可以开始创建一个地址,然后把这个地址给newtail和newHead,这样我们就不需要这样麻烦判断了,但是记得。题目思路:创建一个新的链表,链表头为newHead,链表尾为newTail,再创建一个指针变量遍历原链表,把值不为val的结点进行尾插,注意,如果我们在结束循环时,要把newTail->next=NULL,否则会报错。思路1:统计结点的总个数,然后最后遍历链表,把中间结点的地址返回。
2024-12-28 18:02:54
491
1
原创 数据结构初阶-单链表讲解2
如果这样会使之后的尾结点指向的不是NULL而是野指针,所以我们需要先进行创建变量,让这个指针变量每次都把这个ptail指向下一个结构体指针的时候存起来,然后再把ptail对应的内存释放,再把ptail置为NULL,否则为野指针之后可能会使程序运行出问题。正确的申请内存空间代码:(改变的是加粗的部分)先从首结点开始找,直到找到pos结点之前的那个结点,然后把pos结点之前的那个结点指向pos结点指向的那个结点地址,然后把pos结点内存释放掉,再把pos置为NULL即可。
2024-12-25 20:56:00
563
1
原创 数据结构初阶-单链表的讲解1
这就要这个指针了,这个指针指向我们需要保存数据的地址,是一个内存空间,这个内存空间是我们自己主动申请的,与顺序表不同,这个内存空间我们是需要插入数据就要申请,删除数据就要释放这个内存空间,所以我们用的是malloc函数,而非realloc,我们不是在原空间上扩大空间,而是申请一个新空间,相对于顺序表不会浪费空间。逻辑,是我们人为认为其是否连续,如:一个很歪歪扭扭的队伍,我们用眼睛去看,不能看做一条直线,所以称为物理结构不连续,但是我们把这个队伍人为的看做一条线,这样就算是逻辑结构上连续了。
2024-12-24 22:31:12
564
2
原创 数据结构初阶-顺序表的应用
定义三个变量,index指向第一个数组第m+n个位置,i指向第一个数组第m个位置,j指向第2个数组第n 个位置(我们需要从大到小比较赋值,如果从小到大比较,比较复杂,和第一个算法没有多大区别)。但是我们测试时用例不通过,这是因为如果nums1没有数据,无法进入循环,而且如果nums2还有数据的话,也没有拷贝过来,所以这个是不行的,故有。这是三个题目,难度不是很大,但是我们需要理解里面的思想,并应用在之后的学习中,下节讲:单链表,不见不散,喜欢的可以一键三连哦。这个代码时间复杂度为O(n^2),不好的解法。
2024-12-23 22:18:10
416
2
原创 数据结构初阶-顺序表
我们需要修改这个结构体,不能赋值)。我们可以把前面有效的数据看做另外一个数组,是动态的,虽然这个数据删除了,我们又不可以置为其他数,这样没有意义,所以不如把这个数移出到这个数组之外,(是不是像眼不见心不烦一样呢,虽然他存在,但是没有意义)。但是我们如果想修改数组所存元素的类型怎么办,我们也可以用typedef定义,之后只需要改变他所对应的类型即可进行全局的修改。这样我们完成了初始化结构体的操作,之后我们需要插入数据,当然我们需要考虑动态数组的作用是什么,就是动态申请空间,如何动态申请空间?
2024-12-23 21:03:37
624
2
原创 数据结构初阶-空间复杂度
时,发现第一个函数的第三个传参是-2,因此我们需要改变传参的方式,故我们需要把k进行改变,我们发现,k大于numsSize,所以我们需要进行取模运算,这样才能防止传参的时候为负数,因此我们可以把函数调用之前的k变为k=k%numsSize。T(n)=3/2*n,可以写成3*(n/2),三次调用函数,但是我们只执行了n/2次,(end-begin)/2可以把end=n,begin=0,这样算出来时间复杂度为O(n)。这样算需要创建一个新的数组,导致空间复杂度变为了O(n),然后时间复杂度为O(n);
2024-12-22 22:20:48
576
1
原创 数据结构篇-时间复杂度
/先把第一项的值传递给一个变量,如果没找到要返回地址的。//而且这个如果输入的值很大,会爆int,这样也有风险,所以我们需要学习算法去解决这种问题。//只要num-=n之后num>=n/2都可以这样算,但是循环条件需要改变。// 因为在n变为无穷大的时候前面的系数影响很小,所以不需要前面的系数。// 我们如今只考虑最坏的情况,即为全部乱序(从大到小的排列)//我们可以认为当n为无穷大的时候,除最高阶项外其余的项可以忽略不计。// 但是当n为无穷大时,底数的大小对结果影响不大,因此可以不写底数。
2024-12-12 21:54:05
948
1
原创 预处理内容
#被称为记号粘合,这样的连接必须产生一个合法的标识符,否则结果是未定义的。//后面这个语句会报错。如果我们想写一个比较大小的函数,实现每种类型都能比较,如何写。1.如果宏比较长,每次使用宏的时候将大幅度增加程序的长度。//所以m没定义也好,定义为0也可,都会执行这句话。//打印数组所有元素的句子我们不一定需要。//可以看到,除了第二句话其他句子颜色都变淡了。//由于m是在预处理时就开始转变了所以这样是正确的。//这个是判断括号里面的常量是不是被定义了。//这个只关心常量是否被定义,而不管他的值。
2024-12-11 22:36:41
314
1
原创 C语言中的分支与循环语句
for循环比较复杂,有三个表达式,分别为初始化,判断,调整,初始化相当于先赋初始值,但是这个值只在循环里面才会有用,如果之前已经初始化了,则可以省略;调整:循环结束后进行改变值,再次进入下次循环,以防死循环,如果在循环里面刻意写入了调整的代码,也可以省略。语法:对switch里面的句子进行判断,再从case中选择,先选完后,若都不符合才执行default语句,case和default语句的顺序没有规定,但是注意:一定要有break跳出判断,不然会执行之后的语句,以下是错误写法。
2024-11-09 18:21:41
383
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人