
数据结构
文章平均质量分 85
数据结构
搬砖狗(●—●)
这个作者很懒,什么都没留下…
展开
-
数据结构—堆
这也是升序建大堆,降序建小堆的原因:升序建大堆,堆顶元素为最大值,将它与最后一个数据交换位置,最后一个数据就被修改为最大值了,然后利用向下调整方法又可以找到第二大的值,依次下去…接着利用堆删除思想来进行排序,假设有n个数据,交换堆顶数据与最后一个数据,然后重新对n-1个数据向下调整建堆,然后重复此操作,直至排序完成。我们会发现,向上调整的过程就是在创建堆的过程,开始堆为空,挨个插入进去,就创建出来小堆,大堆的创建跟他相反就可以了。以上如有错误,请批评指正!原创 2023-06-24 16:38:00 · 81 阅读 · 0 评论 -
数据结构—二叉树链式结构实现
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。二叉树的前序遍历步骤就像上图所示,其实他就是在一步一步的递归下去,先从根节点开始,一直遵循。以上如有错误,请批评指正!原创 2023-06-25 23:08:53 · 96 阅读 · 0 评论 -
七大排序之直接插入排序
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。:直接插入排序并不会改变一个有序序列的相对位置,原来是什么样,插入完以后他俩的相对位置不会改变,所以是稳定的。,因为在插入的过程中并没有开辟新的空间。原创 2023-06-26 11:08:46 · 96 阅读 · 0 评论 -
数据结构—队列
我们会发现他们入队的效果其实一样,但是出队就不一样,数组需要将后面的每一个元素都往前挪动,而链表就是改变头结点的位置就可以了。队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出性质。初始化队列就是将队头队尾置空就可以了。:进行插入操作的一端称为队尾。:进行删除操作的一端称为队头。以上如有错误,请批评指正!原创 2023-06-22 16:50:11 · 169 阅读 · 1 评论 -
数据结构—二叉树初阶
完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一 一对应时称之为完全二叉树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继,因此,树是递归定义的。:若一个节点含有子节点,则这个节点称为其子节点的父节点;:以某节点为根的子树中任一节点都称为该节点的子孙。:一个节点含有的子树的根节点称为该节点的子节点;节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。原创 2023-06-23 16:34:02 · 137 阅读 · 1 评论 -
数据结构—单链表
单链表查找其实很简单,就是遍历一遍链表,然后如果有一个节点指向的值与我们要查找的值相等,就返回这个节点,如果遍历一遍依然找不到,就返回一个空指针,不过要注意的是,如果链表中存在两个相同的值,就会查找到第一个位置的值,然后就不会继续查找了;概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。从上图可以看出,链式结构在逻辑上是连续的,但在物理上不一定是连续的,申请的空间可能连续,也可能不连续。原创 2023-06-21 15:46:39 · 81 阅读 · 0 评论 -
数据结构—栈
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。:栈的删除操作叫做出栈。以上如有错误,请批评指正!原创 2023-06-22 10:40:57 · 123 阅读 · 1 评论 -
七大排序之希尔排序
希尔排序实际上是对插入排序算法的优化,当一个元素集合是逆序时,使用插入排序算法的时间复杂度为,当他是顺序时,他的时间复杂度就为, 我们发现,当被排序的对象越接近有序时,插入排序的效率越高,那我们是否有办法将数组变成接近有序后再用插入排序,此时希尔大佬就发现了这个排序算法,并命名为。原创 2023-06-26 19:14:24 · 281 阅读 · 0 评论 -
数据结构—顺序表
在pos位置插入一个值,首先我们得找到这个位置,然后在进行插入,在这儿的创建一个查找的函数,找到pos位置,然后就可以进行插入了,他跟头插性质一样,将插入位置后面的元素每个都向后移动一位,然后size在进行++;顺序表头插就是将某个元素插入到最开始的位置,如果数组为空的话就直接插入,如果数组不为空的话就是,就是数组中已有的元素整体都向后挪动,然后再插入到最开始的位置。顺序表头删就是将最开始位置的元素给删掉,就是将最开始那个元素给覆盖掉,然后每个元素整体向前移动一位,最后size在- -;原创 2023-06-20 16:14:46 · 194 阅读 · 0 评论 -
数据结构—带头双向循环链表
带头双向循环链表,就是它有一个头节点,就相当于一个哨兵位,他整个结构是循环的,可以通过头的位置找到尾,也可以通过尾的位置找到头,不需要向单链表一样,在尾插尾删是需要找到尾的位置;双向循环链表的初始化就相当于创建一个有节点,让头结点的prev指向头结点,头结点next也指向头结点。在这儿其实跟单链表的查找一样,遍历一遍链表,如果找到了,就将该位置返回,如果找不到,就返回一个空指针;以上如有错误,请大家批评指正!原创 2023-06-22 08:22:40 · 214 阅读 · 1 评论 -
栈与队列常见习题分析
此时我们模拟实现的是栈,插入就需要从栈顶入,而队列入元素是从队尾入,他们性质都是一样的,但是此时有两个队列,我们该入那个呢?在这儿就必须保证有一个队列是空的,如果两个队列里都有元素,我们无法进行下一步了。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。原创 2023-06-29 21:32:35 · 182 阅读 · 0 评论 -
七大排序之归并排序
是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。原创 2023-06-28 11:01:26 · 94 阅读 · 0 评论 -
七大排序之快速排序
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。首先我们来看一段动图,来理解一下hoare版本的快排运行一次是什么样的:我们假设此时升序排列,其实就是定义一个基准值key,然后定义一个left,right,left找比key大的值,right找比key小的值,然后l原创 2023-06-27 21:09:32 · 100 阅读 · 0 评论 -
顺序表链表练习题
当数量为奇数时,slow走一步,fast走两步,当slow走到中间时,fast走到最后,此时fast->next == NULL;思路:设置双指针,如果fast不为空,让fast先走k步,slow与fast再都往后走。当数量为偶数时,slow走到中间位置,fast == NULL;思路二:增加一个哨兵位节点。思路一:原链表上进行修改。原创 2023-06-30 17:30:12 · 118 阅读 · 0 评论 -
七大排序之选择排序
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。选择排序优化上面算法是每次将最小值找出来,我们可以用时找最大值,最小值,最小值放左边,最大值放右边,依次进行排序,这样就大大提高了效率。先将begin位置与min位置进行交换,再将end位置与max位置进行交换:然后begin右移,end左移,找min,max位置,继续交换:依次进行下去:在这过程中要注意的是:出现上面这种情况是,begin == max,我们先将begin与ma原创 2023-06-26 22:11:20 · 77 阅读 · 0 评论 -
Linux之动静态库
我们可以通过配置/etc/ld.so.conf.d/的方式解决该问题,/etc/ld.so.conf.d/路径下存放的全部都是以.conf为后缀的配置文件,而这些配置文件当中存放的都是路径,系统会自动在/etc/ld.so.conf.d/路径下找所有配置文件里面的路径,之后就会在每个路径下查找你所需要的库。我们使用gcc编译的是C语言,而gcc就是用来编译C程序的,所以gcc编译的时候默认就找的是C库,但此时我们要链接的是哪一个库编译器是不知道的,因此我们还是需要使用。原创 2023-09-19 22:57:28 · 240 阅读 · 0 评论 -
位图原理及实现
我们可以将着三种状态分别定义为00、01、10,此时当我们读取到重复的整数时,就可以让其对应的两个位按照00→01→10的顺序进行变化,最后状态是01的整数就是只出现一次的整数。我们会发现无符号整数有2^ 32 个,而我们如果以bit位来计量的话,就只需要 2^32个bit位,也就是512MB的空间,内存当中是可以进行存储的,那么我们该如何进行操作呢?一个位只能表示两种状态,而要表示三种状态我们至少需要用两个位,因此我们可以开辟两个位图,这两个位图的对应位置分别表示该位置整数的第一个位和第二个位。原创 2023-09-17 15:29:24 · 187 阅读 · 0 评论 -
C++之AVL树
/存储键值对//三叉链结构//平衡因子int _bf;//构造函数,_kv(kv),_bf(0){}原创 2023-09-06 16:09:38 · 209 阅读 · 0 评论 -
C++二叉搜索树
被删除的结点两边都不为空,此时就需要我们考虑用替换法来删除,我们可以考虑用被删除结点左子树的最大值或者是右子树的最小值来替换掉被删除结点,因为这样删除以后并不会破坏二叉搜索树的性质,我们以右子树的最小值来替换掉被删除结点为例,我们需要定义一个min结点来记录右子树的最小值,定义一个minParent记录min结点父节点位置。对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。原创 2023-08-30 16:54:26 · 227 阅读 · 0 评论 -
C++之红黑树
红黑树结点的定义其实和AVL树差不多,只不过红黑树结点少了平衡因子,多了颜色。//枚举结点颜色enum colorRED,BLACK//三叉链结构//存储的键值对//结点颜色color _col;//构造函数,_kv(kv),_col(RED){}为什么构造结点时,默认将结点的颜色设置为红色?我们可以发现,红黑树的有一条性质是所有路径黑色结点的数目都相等,如果欧姆尼新插入的结点默认为黑色,就会破坏这条性质,我们就需要对红黑树进行调整。原创 2023-09-09 17:44:07 · 1807 阅读 · 0 评论