![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 73
既然开始学,就一定要学透
芒骁
用代码改变世界
展开
-
排序算法八:计数排序
计数排序(Counting Sort)计数排序不是基于比较的排序算法,其核心在于将输入的数据转化为键存储在额外开辟的数组空间中,作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是确定范围的整数。算法描述:找出待排序的数组中最大和最小的元素;统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项;对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);反向...转载 2019-12-24 21:35:38 · 208 阅读 · 0 评论 -
排序算法七: 堆排序
堆排序(Heap Sort)堆排序是指利用堆进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的 n-1 个序列重新构造成一个堆,这样就会得到 n 个元素中的次小值。如此反复进行,便可以得到一个有序序列了。如下图,将 90 与 20 末尾元素互换。堆堆是...转载 2019-12-24 21:23:45 · 385 阅读 · 0 评论 -
排序算法六:快速排序——冒泡算法2.0
快速排序(Quick Sort)快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。...转载 2019-12-24 19:37:05 · 145 阅读 · 0 评论 -
排序算法五:归并排序
归并排序(Merge Sort)归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为 2-路归并。算法描述:把长度为 n 的输入序列分为两个长度为 n / 2 的子序列对这两个子序列分别采用归并排序;将两个排序好的序列合并成一个最终...转载 2019-12-24 16:49:38 · 266 阅读 · 1 评论 -
排序算法四: 希尔排序(Shell Sort)——插入排序2.0
1959年Shell发明,第一个突破O(n^2^)的排序算法。是简单插入排序的改进版,它与插入排序的不同之处就在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。算法描述:先将整个待排序的记录序列分割成若干个子序列分别进行直接插入排序,具体算法描述:选择一个增量序列 t1, t2, …… tk, 其中ti > tj, tk = 1;按增量序列个数 k ,对序列进行 k ...转载 2019-12-24 14:44:19 · 98 阅读 · 0 评论 -
排序算法三: 插入排序
插入排序(Insertion Sort):插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置插入。算法描述:一般来书,插入排序都采用 in-place在数组上实现,具体算法描述如下:从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫...转载 2019-12-24 13:45:34 · 269 阅读 · 0 评论 -
排序算法二: 选择排序
选择排序(Selection Sort)选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾,以此类推,直到所有元素均排序完毕。算法描述:n 个记录的直接选择排序可经过 n-1 次直接选择排序得到有序结果,具体算法如下:...转载 2019-12-24 12:59:17 · 154 阅读 · 0 评论 -
排序算法一:冒泡排序
冒泡排序实现冒泡排序(Bubble Sort)一种交换排序。基本思想: 两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。图源来自:https://www.cnblogs.com/onepixel/p/7674659.html,另提一句,动图牛批。function bubbleSort(arr) { var len = arr.length; for ...转载 2019-12-24 11:28:27 · 90 阅读 · 0 评论 -
排序(拓展)
十大经典排序算法算法分类十种常见排序算法可以分为两大类:比较类排序: 通过比较来决定元素间的相对次序,由于其时间复杂度不能突破 O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。...转载 2019-12-24 11:17:11 · 146 阅读 · 0 评论 -
排序
排序的定义:假设含有 n 个记录的序列为{r1, r2…… rn},其相应的关键字分别为{k1, k 2 ,…… kn}, 需确定 1, 2 ,……, n 的一种排列 p1 , p2, …… pn,使其相应的关键字满足 kp1 <= kp2 <= ……<= k pn(非递减或非递增)关系,使得序列成为一个按关键字有序的序列{rp1, rp2 ,……rpn},这样的操作就称为排...原创 2019-12-24 10:42:43 · 89 阅读 · 0 评论 -
散列表查找实现
1. 散列表查找算法实现首先定义一个散列表的结构以及一些相关的常数。其中 HashTable 就是散列表结构, 结构当中的 elem 为一个动态数组。#define MAXSIZE 100 /* 存储空间初始分配量 */#define SUCCESS 1#define UNSUCCESS 0#define HASHSIZE 12 /* 定义散列表长为数组的长度 */#defin...原创 2019-12-23 19:06:49 · 865 阅读 · 0 评论 -
处理散列冲突的方法
1. 开放定址法一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。 发生冲突,另寻他处我们把这种解决冲突的方法称为线性探测法。 我们在解决冲突的时候,还会碰到比如说一个数 48, 它所在的位置已经被占用,它只能往后延,但是又与后面的冲突 ,本来两个数一点关系都没有,但是发生冲突,这种现象称为堆积, 堆积的出现使得我们需要不断处理冲突,即48要不...原创 2019-12-23 18:35:06 · 2954 阅读 · 0 评论 -
8.2 有序表查找
折半查找折半查找(Binary Search)技术,又称二分查找,它的前提是线性表中的记录必须是关键码有序(通常从大到小),线性表必须采用顺序存储。折半查找的基本思想是:(不用看了,都是些废话)在有序表中,取中间值作为比较对象,若给定值与中间记录的关键字相等,则查找成功,若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不...原创 2019-12-20 19:40:27 · 259 阅读 · 0 评论 -
8.1 顺序表查找
顺序查找概念(Sequential Search)又称线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录,如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。/* 顺序查找,a为数组,n为要查找的数组个数,key为要查找的关键...原创 2019-12-20 18:25:32 · 189 阅读 · 0 评论 -
8. 查找
概念解释查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合。关键字(Key)是数据元素中某个数据项的值,又称为键值,用它可以标识一个数据元素。也可以标识一个记录中的某个数据项(字段)我们称为关键码。若此关键字可以唯一地标识一个记录,则称此关键字为主关键字(Primary Key)。主关键字所在的数据项称为主关键码。查找(Searching)就是根据给定的某个值,...原创 2019-12-20 17:59:40 · 138 阅读 · 0 评论 -
图的遍历
希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次,这一过程叫做图的遍历(Traversing Graph)。深度优先遍历Depth_First_Search, 有时也称为深度优先搜索,简称为 DFS 。它的具体思想先到一个路径的终点,再从另一个路径的起点开始。假设需要从下图这样的迷宫中,从顶点 A 开始要走遍所有的图顶点并做上标记。首先从顶点 A 开始,做上表示走过的记...原创 2019-12-18 17:13:09 · 609 阅读 · 0 评论 -
7、非线性结构——图
图的定义在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后驱。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中的多个元素相关,但只能和上一层中一个元素相关。图是一种较线性表和树更加复杂的数据结构。在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。定义中注意事项:在图中数据元素,我们...原创 2019-12-18 10:22:42 · 1489 阅读 · 0 评论 -
赫夫曼树及其应用(压缩)
David Huffman 赫夫曼赫夫曼树定义与原理以考试成绩为例。先将以上两棵二叉树简化为叶子带权的二叉树:如图,A 表示不及格、B 表示及格、C 表示中等、D 表示良好、E 表示优秀。每个叶子的分支线上的数字就是刚才我们提到的五级分制的成绩所占比例数。(即各个分数段所占人数比例)名词解释:路径长度: 赫夫曼定义到,从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上...原创 2019-12-14 19:17:44 · 168 阅读 · 0 评论 -
二叉树的建立与线索二叉树
二叉树的建立如果要在内存中建立一个如上图左图这样的树,为了能让每个结点确认是否有左右孩子,我们对其进行了扩展,变成右图的样子,也就是将二叉树中每个结点的空指针引出一个虚结点,其值为一特定值,比如“ # ”,我们称这样处理后的二叉树为原二叉树的扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。比如上图的前序遍历序列就为 AB#D##C##。之后生成二叉树。假设二叉树的结点均为一个...原创 2019-12-14 18:49:15 · 973 阅读 · 1 评论 -
遍历二叉树
二叉树遍历原理二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问依次且仅被访问一次。关键词: 访问 和 次序。访问其实是要根据实际的需要来确定具体做什么,比如对每个结点进行相关计算,输出打印等。二叉树的遍历次序不同于线性结构,最多也就是从头至尾、循环、双向等简单的遍历方式。树的结点之间不存在唯一的前驱和后...原创 2019-12-08 08:59:53 · 274 阅读 · 0 评论 -
二叉树
二叉树的定义二叉树(Binary Tree)是 n (n >= 0)个结点的有限集合,该集合或者空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。二叉树的特点每个结点最多有两棵子树,所以二叉树不存在度大于 2 的结点左子树和右子树是有顺序的。次序不能任意颠倒。即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。特殊二叉...原创 2019-12-07 20:31:52 · 149 阅读 · 0 评论 -
树的存储结构
因为树中某个结点的孩子可以有多个,这就意味着,无论按何种顺序(无论是顺序存储还是链式)将树中所有结点存储到数组中,结点的存储位置都无法直接反映逻辑关系。不过充分利用顺序存储和链式存储的特点,完全可以实现对树的存储结构的表示,三种不同的表示法:双亲表示法、孩子表示法、孩子兄弟表示法。双亲表示法...原创 2019-12-07 19:13:34 · 1469 阅读 · 0 评论 -
5. 线性结构——串
串的定义串(string)是由零个或多个字符组成的有限序列,又叫字符串。一般记为 s = “a1a2……an”(n >= 0),其中,s 是串的名称,ai 可以是字母、数字或其他字符, i 就是该字符在串中的位置。串中的字符数目 n 称为串的长度,定义谈到“有限”是指长度 n 是一个有限的数字,零个字符的串称为空串(null string) ,它的长度为零,串的抽象数据类型串的逻辑结...原创 2019-12-06 23:06:05 · 2226 阅读 · 0 评论 -
队列的链式存储结构及实现
队列的链式存储结构,其实就是线性表的单链表。只不过是能尾进头出,简称为链队列。为了操作上的方便,将队头指针指向链队列的头结点。而队尾指针指向终端结点。空队列时,front 和 rear 都指向头结点。链队列的结构为:typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */typedef struct QNode /* 结点结构 ...原创 2019-12-06 20:03:21 · 1343 阅读 · 0 评论 -
4.线性结构——队列
队列的定义队列(queue)是只允许在一段进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO,允许插入的一段称为队尾,允许删除的一段称为队头。队列的抽象数据类型同样是线性表,队列也有类似线性表的各种操作,不同的是插入数据只能在队尾进行,删除数据只能在队头进行。循环队列队列顺序存储的不足入队列操作,即在...原创 2019-12-06 19:37:54 · 389 阅读 · 0 评论 -
栈的作用与应用
栈的作用——在实践中才能体会深刻1栈的引入简化了 程序设计的问题,划分了不同关注层次,使得思考范围缩小,更加聚焦了我们要解决的问题核心。反之,像数组等,因为要分散精力去考虑数组的下标增减等细节问题,反而掩盖了问题的本质。栈的应用——递归(鼎鼎有名)经典递归——斐波那契数列假如兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来,假设所有兔都不是,那么一年以后可以繁殖多少对兔子...原创 2019-12-06 18:46:15 · 1967 阅读 · 0 评论 -
栈的链式存储结构及实现
栈的链式存储结构单链表有头指针,而栈顶指针也是必须的。办法:将栈顶放在单链表的头部,不需要头结点。链栈特点:对于链栈来说,基本不存在栈满的情况,除非内存已经没有可以使用的空间。对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top = NULL的时候。栈链的结构如下:/* 链栈结构 */typedef struct StackNode{ SEl...原创 2019-12-06 15:23:42 · 258 阅读 · 0 评论 -
栈的顺序存储结构及实现
栈的顺序存储结构下标为 0 的一段作为栈底比较好,因为首元素都存在栈底,变化量最小。/* 顺序栈结构 */typedef struct{ SElemType data[MAXSIZE]; int top; /* 用于栈顶指针 */}SqStack;如图所示,栈结构定义。定义一个变量来指示栈顶元素在数组中的位置,它可以来回移动,若存储栈的长度为Stack...原创 2019-12-06 14:56:55 · 1684 阅读 · 0 评论 -
3. 线性结构——栈
栈的定义栈(stack):是限定仅在表尾进行插入和删除操作的线性表。我们把允许插入和删除的一段称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。栈的特点:首先它是一个线性表,即栈元素具有线性关系,即前驱后继关系。它的特殊之处就在于限制了这个线性表的插入和删除位置,它...原创 2019-12-06 14:29:17 · 521 阅读 · 0 评论 -
循环链表
循环链表定义将单链表中终端结点的指针端由空指针改为指向头结点,这使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(clrcular linked list)循环链表解决了一个很麻烦的问题:如何从当中一个结点出发,访问到链表的全部结点。为了使空链表和非空链表处理一致:我们通常设一个头结点,带有头结点的空链表:非空的循环链表:循环链表和单链表的主要差异就在于循...原创 2019-12-06 11:38:19 · 287 阅读 · 0 评论 -
静态链表
静态链表定义用数组代替指针,来描述单链表。首先让数组的元素都是由两个数据域组成,data和cur 。也就是说,数组的每个下标都对应一个 data 和一个 cur 。数据域 data,用来存放数据元素,也就是要处理的数据,而游标 cur 相当于单链表中的 next 指针,存放该元素的后继在数组中的下标 。这种用数组描述的链表叫做静态链表。,通常为了方便插入数据,我们会把数组建立得大一些。以便有...原创 2019-12-06 11:11:03 · 583 阅读 · 0 评论 -
线性表——单链表
单链表中,在C语言中用结构指针来描述。假设 p 是指向线性表第 i 个元素的指针,p -> data 表示结点 ai 的数据域。p -> next 表示结点 ai 的指针域,p -> next 的值是一个指针, 指向第 i + 1个元素。即指向 ai+1的指针。则如果 p -> data = ai ,那么 p -> next -> data = ai+...原创 2019-12-06 10:01:47 · 914 阅读 · 0 评论 -
2. 线性结构-线性表
2.1 线性表的定义线性表(List):零个或多个数据元素的有限序列。它是一个序列。即元素之间是由顺序的,若元素有多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。线性表强调是有限的,元素个数当然是有限的。数学语言定义:所以线性表元素的个数n(n >= 0)定义为线性表的长度,当n=0时,称为空表。在非空表中的每个数据元素都有一个确定的...原创 2019-12-05 18:42:08 · 473 阅读 · 0 评论 -
数据结构学习图
原创 2019-12-05 10:40:31 · 56 阅读 · 0 评论