
数据结构
modi000
生命不止,奋斗不息!
展开
-
常用的数据结构及算法
优化方式二:将每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为,空。3)孩子兄弟表示法:任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。1)双亲表示法:通过静态数组的方式,存储当前结点的数据、双亲的位置(根节点的双亲结点设置为-1)。该方法的优点是容易找到结点的双亲结点,但是找结点的孩子结点就需要遍历。优化方式:除双亲的位置外,再增加一个长子域(最左孩子的位置),如结点无孩子结点,长子域设置为-1。链表常用的是单链表。原创 2024-04-17 14:20:53 · 2338 阅读 · 0 评论 -
『算法』哨兵查找算法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。然后,我们从后向前查找,如果和目标值相同,则结束循环,否则向前走。当下标为0时,会结束循环,因为0号下标是目标值;本篇博客介绍一下哨兵查找算法,哨兵查找算法是对顺序查找的一个优化。如果不同,则我们将0号下标元素先保存起来,然后将目标值放到0号下标处;最后判断index是否大于0,如果大于0表示找到了,否则就是没找到。首先,判断0号下标元素是否和目标值相同,如果相同,直接返回0;上述程序是一个典型的。转载 2024-04-09 09:53:25 · 84 阅读 · 0 评论 -
或运算的理解
p || j>i) 还添加了 j>i ,其实while推出循环后,是不存在j>i的情况,之所以要加这个条件,是因为要排除没进while循环的情况,j=1,j>i 即排除了i原创 2024-03-08 11:18:33 · 640 阅读 · 0 评论 -
链表头结点和不带头结点的区别
的插入删除需要移动大量的元素,因此引入链表(本文讨论单链表)的概念,链表元素之间通过“链”来链接,因此插入和删除时不需要大量的移动元素,而只需要改变“链”的关系即可。若不使用头结点,当表非空时,头指针指向第1个结点的地址,即*LNode类型,但是对于空表,头指针指向的是NULL,此时空表和非空表的操作是不一致的。若使用头结点,无论表是否为空,头指针都指向头结点,也就是*LNode类型,对于空表和非空表的操作是一致的。因此,不带头结点的链表,插入第一个结点时,需要特殊处理,删除操作类似。转载 2024-03-04 13:18:27 · 956 阅读 · 0 评论 -
堆排序详细图解(通俗易懂)
堆是一种叫做完全二叉树的数据结构,可以分为大根堆,小根堆,而堆排序就是基于这种结构而产生的一种程序算法。转载 2024-02-18 16:04:42 · 2530 阅读 · 0 评论 -
C语言——冒泡排序
以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……版权声明:本文为优快云博主「小明的c++笔记本」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。值得注意的是函数中的定义的count是为了检验是否进行了元素的交换,是对代码的一种优化。转载 2023-11-20 11:49:19 · 121 阅读 · 0 评论 -
时间复杂度计算方法以及常见的时间复杂度
即,我们将字母取无穷大,例如本题中字母为n,n取无穷大,而十对于n取无穷大后没有影响,因此10可以舍去,原表达式化为n*n+n,再转化为n*(n+1),由于n为无穷大,因此-1也是没有影响的,原式就变成了O(N*N)。指数阶一般是算法题的暴力解法,一般是多层循环的嵌套,例如上面题二中,最大是两层n次循环的嵌套因此`时间复杂度为O(N^2),n的平方次,要是三层n次循环的嵌套则为O(N^3).因为假设n是数k的因子,那么n^2也必定是数k的因子,所以不需要枚举小于k这么多数,只需要枚举根号n个数就可以了.转载 2023-11-19 16:31:23 · 571 阅读 · 0 评论 -
六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
3、在走的过程中,若end遇到小于key的数,则停下,begin开始走,直到begin遇到一个大于key的数时,将begin和right的内容交换,end再次开始走,如此进行下去,直到begin和end最终相遇,此时将相遇点的内容与key交换即可。在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。5.将key的左序列和右序列再次进行这种单趟排序,如此反复操作下去,直到左右序列只有一个数据,或是左右序列不存在时,便停止操作,此时此部分已有序。转载 2022-10-17 10:10:33 · 363 阅读 · 0 评论 -
数据结构——二叉树先序、中序、后序及层次四种遍历
先序遍历结果为:A B D H I E J C F K G 动画演示: 中遍历结果为:H D I B E J A F K C G 动画展示:后序遍历中,根节点默认最后面后序遍历结果:H I D J E B K F G C A 动画展示: 层次遍历结果:A B C D E F G H I J K解释外圈跑的意思:这里的根,指的是每个分叉子树(左右子树的根节点)根节点,并不只是最开始头顶的根节点,需要灵活思考理解,建议画图理解!!typedef struct Tree{int data; // 存放数转载 2022-10-13 14:59:04 · 19091 阅读 · 7 评论 -
链表插入结点的两种思路
插入元素时,要先找到该元素的前一个元素。a为当前结点;b为要插入的结点;c为a之后的结点;相较删除结点两种思路,插入结点只有一种思路:1、保存a的next(即c)b ->next = a->next;2、a->next重新赋值a->next = b;举例:无头结点的单链表为例,插入第一个元素头插法:尾插法:LinkLis...原创 2020-03-25 09:16:20 · 3821 阅读 · 0 评论 -
链表删除结点两种思路
1、删除元素有两种思维方式:(我们以没有头结点的单链表为例)b为要删除的结点a为b的前驱结点c为b的后继结点当前指针指在a上。1)思路一:首先保存住要删除结点的next//删除b的话,需要先保存住b的next(a->next->next)temp = a->next->next;//释放掉bfree(a->next);//a的n...原创 2020-03-25 09:15:53 · 1693 阅读 · 0 评论 -
线性表链式结构基本操作(不带头结点的单链表)
不带头结点的单链表如图所示:1、初始化链表//将头指针置空void InitList(LinkList &slink){ slink = NULL;}2、销毁链表//将malloc的空间全free掉,将头指针置空void Destroy(LinkList &slink){ /* 遍历表,逐个free当前链表,直至表尾...原创 2020-03-25 08:17:46 · 2676 阅读 · 0 评论 -
线性表链式结构基本操作(带头结点的单链表)
与顺序结构相比,链式结构在插入和删除数据上时,不需要移动大量数据,适用于经常需要插入和删除数据的线性表。struct Node{int data;Node *next;};typedef Node *LinkList;...原创 2020-03-25 08:17:03 · 1633 阅读 · 0 评论