数据结构
文章平均质量分 77
一个数学不怎么好的程序员
在虚空中,你一天都不能渡过
展开
-
八大排序 (万字总结)(详细解析,建议收藏!!!)
文章目录直接插入排序代码实现复杂度的计算希尔排序希尔排序的预排序代码实现选择排序代码实现堆排序冒泡排序代码实现快速排序递归实现Hoare版本代码实现递归图解挖坑法代码实现递归图解前后指针法代码实现递归图解非递归实现Hoare版本挖坑法前后指针法非递归快排代码实现图解代码快速排序的两个优化1.三数取中代码实现2.小区间的优化代码实现归并排序递归实现递归图解区间划分要注意(死递归)非递归实现代码实现递归图解计数排序绝对映射和相对映射代码实现八大排序性能测试???? 注:以下排序都是以排升序为例。直接插入原创 2021-09-18 16:38:10 · 17054 阅读 · 74 评论 -
排序算法学习(2)(快速排序,归并排序,计数排序)(详细解析,建议收藏!!!)
文章目录快速排序递归实现Hoare版本代码实现递归图解挖坑法代码实现递归图解前后指针法代码实现递归图解非递归实现Hoare版本挖坑法前后指针法非递归快排代码实现图解代码快速排序的两个优化1.三数取中快速排序快速排序是公认的排序之王,其基本思想为: 任取待排序元素序列中的某元素作为基准值,按照该基准值将待排序列分为两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后左右序列重复该过程,直到所有元素都排列在相应位置上为止。对于如何按照基准值将待排序列分为两子序列,常见的方式原创 2021-09-18 15:45:14 · 1754 阅读 · 4 评论 -
排序算法学习(1)(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)
文章目录直接插入排序代码实现复杂度的计算希尔排序希尔排序的预排序代码实现选择排序代码实现堆排序冒泡排序代码实现???? 注:以下排序都是以排升序为例。直接插入排序直接插入排序的主要思路就是:1.首先默认第一个元素是有序的。2.然后将其下一个元素作为待排序的元素,插入到前面有序序列的相应位置。至于插入的过程,如果遇到比待排序大的元素,则这个元素后移,直到遇到比其小的元素,然后将待插入元素放入其前一个位置。代码实现void Insertsort(int *a, int sz){ i原创 2021-09-12 15:01:32 · 1266 阅读 · 57 评论 -
二叉树初阶OJ题(内附递归图解,思路)(建议收藏!!!)
文章目录1.单值二叉树解题思路代码实现图解递归2.二叉树的最大深度解题思路代码实现图解递归3.翻转二叉树解题思路思路1:代码实现思路2:代码实现图解递归解法1递归分析解法二图解递归4.对称二叉树解题思路代码实现图解递归5.两个树是否相同解题思路代码实现图解递归6.二叉树的前序遍历解题思路代码实现7.二叉树的遍历及构建解题思路代码实现图解递归8.平衡二叉树解题思路解题思路1:代码实现解题思路2:代码实现图解递归解法一图解递归解法二图解递归9.另一棵树的子树解题思路代码实现1.单值二叉树解题思路1.判原创 2021-09-10 11:58:02 · 927 阅读 · 64 评论 -
二叉树之结点相关操作
文章目录结点的个数代码实现叶子结点的个数代码实现第k层结点的个数结点的个数求解树的结点总数时,可以将问题拆解成子问题:1.若为空,则结点个数为0。2.若不为空,则结点个数 = 左子树结点个数 + 右子树结点个数 + 1(自己)。代码实现int BinaryTreeSize(BT* root){ //结点个数 = 左子树的结点个数 + 右子树的结点个数 + 自己 return root == NULL ? 0 : BinaryTreeSize(root->left) + Binar原创 2021-09-08 09:55:17 · 779 阅读 · 12 评论 -
带你图解二叉树的多种递归遍历(建议收藏!!)
文章目录二叉树的构建结点类型的定义构建二叉树之间的关系深度优先遍历前序遍历代码实现图解递归(由于图片大小问题,建议用手机客户端查看,以下图解也是)中序遍历代码实现图解递归后序遍历代码实现图解递归广度优先遍历层序遍历代码实现二叉树的构建为了实现二叉树的遍历,我们要先构建一个二叉树,这里就先简单构建一个。结点类型的定义既然是链式二叉树,那必须得有自己的结点类型,以下是链式二叉树结点类型的定义typedef char BTDataType;typedef struct BinaryNode{原创 2021-09-05 16:16:37 · 6574 阅读 · 50 评论 -
Topk问题的三种求解方法
Topk问题的三种求解方法什么是Topk问题方法一:堆排序法方法二:把N个数建堆,取出前k个方法三:建一个k个数的堆什么是Topk问题其实顾名思义,这个问题也就是在N个数中找出前k个最值。在我们的日常生活中,很多地方都有Topk问题的影子,例如我们在点外卖时,总会说这家店是某某市的多少名,其实这些都是用Topk问题的解决方法得出来的。方法一:堆排序法这也是最容易想到的一种方法:我们可以将N个数排成有序的,然后输出前k个最值,而在我们已学过的排序算法中,堆排序的时间复杂度又是最快的(O(n*lo原创 2021-09-02 17:11:50 · 5846 阅读 · 41 评论 -
关于堆的知识
堆排序什么是堆堆的向下排序算法代码实现如何对无规律的数组进行堆的向下排序代码实现建堆的时间复杂度堆排序代码实现什么是堆可能概念讲的不是很好理解,下面我们看两幅图。那么问题来了?我们给的一组数据总不可能就那么巧吧,正好是有序的。这时就要介绍一个算法了:堆的向下排序算法。使一组不是那么有规律的数字也变成堆。堆的向下排序算法int array[] = {27,15,19,18,28,34,65,49,25,37};从这组数据中你能发现什么特点吗?也不难发现,这组数据除了根节点,左右子原创 2021-09-02 11:08:03 · 862 阅读 · 19 评论 -
【每天学习亿点点系列】——栈和队列OJ题
????【每天学习亿点点系列】——栈和队列OJ题1.用队列实现栈图解代码实现2.用栈实现队列图解代码实现这两题的对比3.循环队列用数组还是链表实现注意点1.如果判断为空还是为满了?2.注意索引越界的问题解决方法代码实现1.用队列实现栈图解既然要用两个队列实现栈,那就肯定会跟队列的性质有关系,肯定是来回换来换去,下面我们就来看看这个过程。代码实现typedef struct { Queue* q1; Queue* q2;} MyStack;/** Initialize原创 2021-08-22 13:57:04 · 486 阅读 · 19 评论 -
【每天学习亿点点系列】——重温栈和队列
【每天学习亿点点系列】——重温栈和队列????【每天学习亿点点系列】——重温栈和队列栈的实现顺序表实现栈头文件以及测试部分代码各个接口的实现1.初始化2.栈的插入3.栈的删除4.栈顶取出数据5.栈里面元素的打印6.记录栈中元素个数7.判空8.栈的销毁单链表实现头文件以及测试部分代码各个接口的实现1.栈的插入2.栈里面元素的打印3.删除栈顶的节点4.取出栈顶的数据5.判空6.记录栈中元素个数7.销毁队列单链表(没有用结构体包裹)来实现头文件以及测试部分各个接口的实现1.队列的插入2.出队列3.删除4.判空5.原创 2021-08-19 16:51:53 · 198 阅读 · 9 评论 -
【每天学习亿点点系列】——重温双向带头循环链表
????【每天学习亿点点系列】——重温双向带头循环链表头文件以及测试文件的实现各个接口的实现1.初始化2.创建节点3.尾插4.头插5.尾删6.头删7.打印8.查找9在任意位置之后插入10.在任意位置之前插入11.记录节点个数12.在任意位置之后删除13.在任意位置之前删除14.删除当前位置15.判空16.销毁注意点1.双向链表要初始化这个接口的,不同与单链表2.带个哨兵位,解决插入的问题3.注意赋值时的先后顺序4.删除时要把节点free掉,同时要注意写法5.判空与以往不同,因为有哨兵位6.不要像释放顺序表一原创 2021-08-17 21:14:44 · 873 阅读 · 8 评论 -
【每天学习亿点点系列】——重温单链表
????【每天学习亿点点系列】——重温单链表头文件以及测试部分的代码单链表各个接口的实现1.尾插2.尾删3.打印4.头插5.头删6.查找7.在任意位置之前插入8.在任意位置之后插入9.删除当前位置10.删除任意位置的前一个节点11.删除任意位置的后一个节点12.销毁13.判空注意点1.单链表的实现方式里面不能用一级指针接收的方式来实现也不可能做的到2.单链表不需要初始化这个接口3.尾节点如何解决的问题(悬疑问题)4. free时注意函数之间可能会有影响(悬疑问题)5.很多接口都要注意分类讨论头文件以及测试原创 2021-08-14 20:18:36 · 628 阅读 · 18 评论 -
队列实现的这些细节你都注意到了吗?
????队列实现的这些细节你都注意到了吗?????队列的实现代码这些细节你都注意到了吗?队列的实现代码Queue.h#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<stdbool.h>typedef int QDataType;typedef struct Node{ QDataType dat原创 2021-08-06 16:57:18 · 190 阅读 · 0 评论 -
⭐顺序表和链表的这些细节你都注意到了吗?⭐
⭐顺序表和链表的这些细节你都注意到了吗?⭐顺序表的细节单链表的细节双向带头循环链表的细节栈的细节几者之间的对比链接这几种数据结构完整的代码,都在我其他的博客里面,这篇博客主要的目的是分析其各自的一些细节,以及他们之间的一些对比的顺序表的细节????初始化void SeqListinit(SLT * ps1){ assert(ps1); //写这些断言的好处是万一错了他会报错,这儿还调试,下面的所有断言都是这个目的 ps1->size原创 2021-08-05 18:03:32 · 564 阅读 · 14 评论 -
⭐栈的多种实现,这样传参是否可以实现了?
⭐栈的多种实现方式,这样传参是否可以实现了?顺序表实现单向链表实现这样传参可以实现吗?顺序表实现Stack.h#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<stdbool.h>//用顺序表来实现栈typedef int STDataType;typedef struct Stack{ STDa原创 2021-08-05 17:42:41 · 480 阅读 · 11 评论 -
双向带头循环链表的实现
双向带头循环链表的实现为什么要有双向带头循环链表代码实现部分(细节在代码的注释中有标注)总结和思考为什么要有双向带头循环链表在之前的一篇博客中,我们写了单链表,发现如果要在某一位置插入或删除一个数据,会比较复杂,而这其中最根本的一个原因就是这个链表是单向的,它无法直接记录前面一个节点的位置,而双向带头循环链表就可以解决这个问题.但他也有自己的缺点,就是结构相对于其他7种链表是最复杂的一种。至于结构这儿就不陈述了,不懂得小白可以去自己了解下。代码实现部分(细节在代码的注释中有标注)List.h#de原创 2021-08-03 17:51:09 · 194 阅读 · 2 评论 -
单链表的实现
单链表的实现为什么要写单链表代码实现部分总结和思考为什么要写单链表之前我们写过了一个数据结构——顺序表,它可以在内存中连续的存放数据,但我们会发现,如果想要往其中插入一个数据,就必须要移动后面所有的数据,效率很低,于是就有了链表,链表在内存中是通过地址的方式来连接的,想要插入一个数据,不需要像顺序表那样复杂,只要将前一个节点的地址指向新的节点,然后将新的节点的地址指向下一个节点就可以了。具体实现我们看下面的代码部分。代码实现部分SList.h#define _CRT_SECURE_NO_WARNI原创 2021-08-01 16:30:42 · 441 阅读 · 4 评论 -
顺序表
顺序表代码实现部分感悟和总结代码实现部分SeqList.h????注意点在注释中#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<assert.h>#include<stdlib.h>typedef int SQDataType; //为了方便以后,万一类型改了,那么到时候只要这么改下就行了typedef struct SeqList{ SQDataType *a; int siz原创 2021-07-29 20:13:43 · 175 阅读 · 1 评论