
数据结构与算法
文章平均质量分 67
两片空白
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
B树概念和插入实现
介绍B树概念,插入实现。介绍B+,B*树介绍B树应用原创 2021-11-22 14:37:53 · 4962 阅读 · 0 评论 -
数据结构——平衡二叉树之删除
目录前言删除结点调整结点代码实现前言 我们知道,在平衡二叉树中插入一个结点可能会改变二叉树的平衡因子,使得平衡因子超过1。但是删除平衡二叉树的一个结点时也会使得二叉树的平衡因子发生改变。也会需要对树进行调整。这篇博客是说明怎么判断调整位置。想了解调整的具体细节的可以看博客数据结构——平衡二叉树(AVL树)之插入。 平衡二叉树删除结点和插入操作类似,首先先删除一个结点,然后对自下向上最近的平衡因子超过1的结点进行调整。删除结点 首先...原创 2021-07-08 09:22:27 · 10969 阅读 · 7 评论 -
哈夫曼树和哈夫曼编码
前言首先举一个例子: 如果要求编写一个程序将百分制的考试转化为不及格(1),通过(2),一般(3),良好(4)和优秀(5),5个等级。通过分析可以得到下面一种图1情况:但是如果需要转换的学生成绩很多,用此判定树的程序效率问题就比较突出了。主要原因是因为学生成绩分布在上述五个分数段中是不均匀的。假设实际学生的成绩分布情况入下表所示:如果按上面图1这种情况,则80%以上的数据需要进行三次及三次以上的数据比较才能得到对应的等级。假设现在有10000个输入数据,需要进行的比...原创 2021-07-07 09:57:09 · 2416 阅读 · 4 评论 -
希尔排序算法
文章目录前言一.原理二.实现前言我们知道简单的插入排序效率并不高,其中的一个重要原因是,每次只能插入到前面时都需要挪动插入位置后的元素。如果我们要从小到大排序的话,一个很大的数排在很前面,那么这个数几乎每一次都会需要移动。这样很影响效率。希尔排序就对这种情况进行了改进,试图通过每次交换相隔一定距离的元素,达到排序的提升。一.原理希尔排序的基本原理是:将排序的一组元素按一定间隔分为若干个序列,分别进行插入排序,开始时设置间隔很大,每轮排序完后间隔逐步减小,直到间隔为1,也就是简单的插入排序。原创 2021-06-26 15:20:37 · 272 阅读 · 0 评论 -
归并排序算法
文章目录一.定义1.归并排序原理2.归并操作二.实现(递归,非递归)1.递归2.非递归三.时间复杂度分析一.定义1.归并排序原理归并排序是建立在归并操作基础上的一种排序方式。归并操作:是指将两个已排序好的子序列合并成一个有序序列的过程。归并排序基本原理:将大小为N的序列看成N个长度为1的子序列(长度为1的子序列我们认为是有序的),接下来将相邻两子序列两两进行归并操作,形成N/2或(N/2)+1个长度为2或1的子序列;然后再继续进行相邻子序列两两归并操作,如此一直循环,直到剩下一个长度为N的序列原创 2021-06-25 20:35:30 · 807 阅读 · 0 评论 -
快速排序(递归和非递归)及其优化
文章目录一.定义二.实现三.优化四.非递归一.定义快速排序也是交换排序的一种,其原理是:将未排序元素中的一个作为基准的主元(Pivot)将未排序序列分为两个子序列,其中一个子序列均小于主元,而另一子序列均大于主元,然后递归的对这两个子序列用同样的方法进行排序。本质上,快速排序使用分治法,将问题规模减小,然后进行分别处理。一般我们选用左边第一个元素作为主元。二.实现挖坑法可见我之前博客快排挖坑法前后指针法代码如下:void Swap(int *px, int *py){ i原创 2021-06-25 15:12:17 · 628 阅读 · 1 评论 -
堆排序与相关时间复杂度
文章目录堆排序代码(升序)时间复杂度介绍堆排序要进行堆排序首先要数据建立成堆,想了解建立堆的小伙伴可以查看我的另外一博客建堆。只需要看向下调整推和建堆两个小部分即可。下面来讲如何实现堆排序:首先我们来讲一下堆排序的思路:假设由N个元素。建立一个堆,然后将最后一个元素和第一个元素交换,这样就将最大值或者最小值放在了最后。然后将前N-1个元素建立成堆,再用第一个元素与第N-1个元素交换,循环到只有一个元素。代码(升序)#include<stdio.h>#include<w原创 2021-06-22 11:20:02 · 338 阅读 · 1 评论 -
数据结构——堆
文章目录前言一.定义三.重要操作1.向下调整堆2.建立堆3.插入向上调整堆4.删除四.代码实现堆前言在现实生活中,我们处理事情时大多数情况下,我们并不是按照顺序,先来先处理的。许多情况下,我们会按照事情优先级来处理事情。比如:某个外科医生,某个患者受了点皮外伤,而排在他后面的患者受了很严重的外伤,这个医生肯定优先处理那个受了严重外伤的患者。下面介绍的堆正是考虑了这种特性的数据结构,通常堆也被称为“优先队列”。一.定义堆是一种特殊的队列,从堆中取出来的元素是按照元素优先级的大小,而不是元素进入队原创 2021-06-21 18:02:41 · 973 阅读 · 0 评论 -
顺序表和链表的优缺点
顺序表定义:在内存中用地址连续的一块存储空间顺序存放线性表的各元素。在程序设计语言中,一维数组在内存中占用的存储空间是一维连续的存储空间,因此我们用一维数组存储数据来表示顺序表。优点:由于顺序表是用数组来存储数据,内存空间连续,当访问数据时可以达到使用数组下标的方式随机访问。CPU高速缓存的命中率高。解释:数据保存在内存中,数据是在CPU里进行运算的(逻辑和算术)。但是CPU速度太快,内存的速度跟不上CPU的速度。于是在CPU和内存之间存在一些寄存器和缓存器,用来保存数据。当CPU要使用数原创 2021-06-21 10:09:08 · 3941 阅读 · 1 评论 -
超实用链表(带头节点双向循环链表)
逻辑结构物理结构带头节点双向循环链表,有两个指针域,一个数据域。一个指针存前面一个结点的地址,一个指针存下一个结点的地址。typedef int Datatype;typedef struct Dlist{ Datatype data; struct Dlist *next; struct Dlist *pre;}Dlist;实现功能Dlist *DlistCreate(Datatype x);//创建结点Dlist *DlistInit(Datatype x);//初始化头节点原创 2021-06-19 19:59:37 · 187 阅读 · 0 评论 -
链表有环的一些常见问题,看这就够了
文章目录1.如何判读链表有环引申问题问题1问题2问题31.如何判读链表有环链表存在有环的逻辑结构可以这样理解:但是实际链表并不存在这些箭头,物理结构为链表结构信息的指针域里存放的是下一个结点的地址。带环就是最后一个结点的地址存的并不是NULL了,而是链表中的一个结点的地址。如何证明一个链表是否有环呢?最好的方法是使用快慢指针法。快慢指针法就是定义两个指针slow和fast,一开始两指针指向链表头。slow指针每次只前进一个结点,fast指针每次前进两个结点。如果链表有环,两指针就会相遇原创 2021-06-19 09:45:26 · 1304 阅读 · 1 评论 -
数据结构——平衡二叉树(AVL树)之插入
文章目录前言一.定义二.基本操作1.查找,删除2.插入(如何调整)如何调整代码实现插入前言首先我们来思考一下一个普通二叉树保存数据,如果想查找一个数据,由于普通二叉树保存数据是随机的,要找到数据的时间复杂度为O(n)。后面为了方便,我们又学习二叉搜索树,它的定义是将比根节点小的数放左边,比根节点大的数放右边,并且每一课子树都是二叉搜索树这样使得数据在树上存储有一定的规律,在一定情况下查找起来很方便。但是,二叉搜索数当给出数据的顺序不同时,二叉搜索树也会不同。比如如果给出的序列为{1,2,3,4,5}原创 2021-06-17 15:54:35 · 8230 阅读 · 5 评论 -
数据结构——二叉搜索树(干货满满)
文章目录一.定义二.基本操作1.查找查找某一结点查找树的最大值:查找树的最小值:2.插入3.删除三.性质一.定义二叉搜索树是一种队排序和查找都很有用的特殊二叉树。又称为二叉排序树和二叉查找树。其定义如下:1.二叉查找树为空树2.非空左子树所有结点的值小于根节点的值3.非空右子树所有结点的值大于根节点的值4.左右子树都是二叉搜索树事例:如图就是一颗二叉搜索树,根节点值为5,其左子树值均小于5,右子树的值均大于5,并且在左子树,右子树中均符合这种情况。二.基本操作树信息:typedef原创 2021-06-15 16:22:42 · 4238 阅读 · 5 评论 -
用层序生成二叉树
文章目录思想与伪代码实现代码:思想与伪代码实现代码:#include<stdio.h>#include<Windows.h>#include<stdbool.h>#include<stdlib.h>#pragma warning(disable:4996)#define Null 0//空结点//用队列建立一颗二叉树typedef struct Tree{//建立树信息 int data; struct Tree *left; s原创 2021-06-14 14:48:16 · 658 阅读 · 0 评论 -
二叉树遍历(先序,中序,后序,层序)递归和非递归形式
文章目录1.先序遍历定义递归非递归2.中序遍历定义递归非递归3.后序遍历定义递归非递归4.层序遍历定义:代码实现(队列)二叉树的遍历是通过一定顺序来访问二叉树的所有结点。遍历的方法有四种:先序遍历,中序遍历,后序遍历和层序遍历。其中前三种一般使用深度优先搜索(DBS)实现,而层次遍历一般用广度优先搜索(BFS)实现。二叉树表示:struct TreeNone{ int data; struct TreeNone *lchild; struct TreeNone *rchild;};注原创 2021-06-13 14:37:53 · 3093 阅读 · 1 评论 -
数据结构——队列
文章目录1.队列定义2.队列表现形式顺序表(数组)链表3.队列主要操作4.队列的代码实现数组:链表1.队列定义队列时一种受限制的线性表,只能再一端进行插入,再另外一端进行删除。就像现实中的排队一样在新来的人排在对尾,拍在队伍前面的人先进行服务后离开,期间不允许插队。简单介绍:假如有一个队列,将A,B,C,D插入队列中,对头元素是A,对尾元素是D。也就是说第一个被删除的元素是A,最后一个被删除的元素是D。由此可见,队列具有一个特征,就是先入先出,后入后出。队列需要两个指针,一个对头指针(fro原创 2021-06-11 10:11:26 · 1108 阅读 · 4 评论 -
线性表——动态顺序表
实现功能typedef int ElementType;//定义数据类型,方便维护typedef struct Node{ ElementType *data;//数组 int size;//数组元素个数 int capacity;//数组大小}seqlist;void Seqlistinit(seqlist *list);//初始化void Seqlistpushfront(seqlist *list,int x);//头插void Seqlistpopfront(seqlist *原创 2021-06-07 10:50:08 · 253 阅读 · 0 评论 -
线性表——链表
写一个链表具有插入节点,删除节点,修改节点的功能#include<stdio.h>#include<Windows.h>#pragma warning(disable:4996)struct Node{ int num; struct Node *next;};struct Node* Creatlist(){//创建链表头 struct Node *headnode = (struct Node*)malloc(sizeof(struct Node));原创 2021-05-24 15:10:19 · 577 阅读 · 0 评论 -
数据结构——栈(顺序表与链表)
文章目录1.栈的定义2.栈的主要操作3.栈的代码实现1.栈的初始化:2.入栈与判断栈满3.出栈与判断栈空1.栈的定义栈可以看作是一个受约束的线性表,插入和删除操作都在栈顶进行。怎么理解呢?我梦可以将栈理解成一个箱子,每次只能将一本书从箱子放入或拿出,并且每次只能在箱子顶上将书放入或拿出,如图:简单介绍:由上图这种特性可知,栈具有数据后入先出,先入后出的特点,通常将数据插入称为压入栈(push),将数据取出叫做弹出栈(pop),栈也被称为后入先出表。栈顶指针,通常是指向栈顶的元素。用数组实现原创 2021-06-10 18:53:58 · 666 阅读 · 2 评论 -
快速排序算法挖坑法(递归)
原理选择一个基准数(一般为数组最左边哪个,注意不是数组下标为0的那个)。将数组中的数与基准数比较,将比基准数大的或者小的放左边或者右边,这里代码有技巧,并且是主要排序函数。运用递归,第两边数组不断重复前面两个步骤,指导只有一个元素,就排序成功了。原理很抽象,来个例子帮助理解:要将数组{5,4,9,7,1}进行排序。画图来展示一轮排序:将两边如此反复,直到只有一个元素,就排序好了。static int Swap(int a[], int left, int right){//将原创 2021-06-04 14:13:07 · 650 阅读 · 2 评论 -
按快速排序算法求数组中第K大值(递归)
这几天在看浙江大学陈越的那本数据结构这本书,看到第二章里有一个求书中有求集合中第K大数的问题。按照它的思路,我想来试一试。思路:用一个基准数e,将集合S分解为两个不包含e在内的两个小集合S1和S2,其中S1中任何元素均大于等于e,S2中任何元素均小于e。记S1长度为len,如果len>=K,则说明第K大数在S1中,如果len=K-1,那么e是第K大数,否则第K大数在S2中,并且是第K-len-1大数。这是教材中的思路。但是我的做法与这个有一些不同。首先我先解释一下,为啥在S2中是求K-len原创 2021-06-04 10:36:03 · 717 阅读 · 1 评论