![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 50
元气满满鸭
一枚小学酥
展开
-
排序算法--快速排序
一.快速排序的思想快速排序可以认为是冒泡排序的升级版,它最重要的思想是分而治之。比如我们有如上这样一段数字需要排序:第一步:随机选择一个数字,假设选择65第二步:通过算法,将所有小于65的数字放在65的左侧,将大于65的数字放在65的右侧第三步:递归的处理左边的数字(比如选择31来处理左侧),递归的处理右侧的数字(比如选择81来处理右侧的数字)最终:排序完成那么快速排序和冒泡排序的区别在哪里呢?在快速排序中,选择的65可以一次性的放在最正确的位置,之后不需要任何移动,即快速排序对数字的定位原创 2021-02-01 23:02:40 · 195 阅读 · 0 评论 -
排序算法--希尔排序
一.希尔排序的思路希尔排序主要通过对数据进行分组实现的排序根据设定的增量(gap)将数据分为gap个组(组数等于gap),再在每个分组中进行局部排序假如有数组有10个数据,第1个数据为黑色,增量为5。那么第二个为黑色的数据index=5,第3个数据为黑色的数据index = 10(不存在)。所以黑色的数据每组只有2个,10 / 2 = 5一共可分5组,即组数等于增量gap。排序之后,减小增量,继续分组,再次进行局部排序,直到增量gap=1为止。随后只需进行微调就可完成数组的排序二.原创 2021-01-29 19:22:08 · 160 阅读 · 0 评论 -
排序算法--插入排序
一.插入排序的思路插入排序思想的核心是局部有序比如在一个队列中的队员,我们选择其中一个作为被标记的队员这个被标记的队员左边的所有队员已经是局部有序的这意味着在队列中,有一部分人是按顺序排好的,另一部分还没有顺序从第一个元素开始,该元素可以认为是已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一位重复上一步骤,直到找到已排序的元素小于或者等于新元素的位置将新元素插入到该位置后,重复上面的步骤二.插入排序的代码ArrayList原创 2021-01-27 16:02:32 · 952 阅读 · 0 评论 -
排序算法--选择排序
一.选择排序的思路选定第一个索引位置,然后和后面的元素依次比较如果后面的元素,小于第一个元素的值,则交换位置经过一轮比较后,可以确定第一位置是最小的可以看出选择排序,第一轮会选出最小值,第二轮会选出第二小的值,直到最后二.选择排序的代码ArrayList.prototype.selectsort = function(){ var length = this.array.length //1.外层循环:从0位置开始取数据 for(var j = 0; j < length - 1原创 2021-01-26 20:28:18 · 741 阅读 · 0 评论 -
排序算法--冒泡排序
首先我们创建一个列表类,将要排序的元素放在一个数组中,便于后期插入和转化function ArrayList(){ //属性 this.array = [] //方法 //将数据可以插入到数组中的方法 ArrayList.prototype.insert = function(item){ this.array.push(item) } //toString方法 ArrayList.prototype.toString = function(){ return this.array原创 2021-01-25 22:50:16 · 1449 阅读 · 0 评论 -
JS数据结构-红黑树-基本规则及操作
一.红黑树的规则红黑树,除了符合二叉搜索树的基本规律外,还添加了以下特性:节点是红色或黑色的根节点是黑色的每个叶子节点都是黑色的空节点(NIL节点):如果该节点是含有数据的节点,并且其没有左、右子节点,那么要用NIL节点补齐每个红色节点的两个子节点都是黑色的(从每个叶子节点到根节点的所有路径上不能有两个连续的红色节点)从任一节点到其每个叶子节点的所有路径上都包含数目相同的黑色节点二.红黑树的相对平衡上述的约束,确保了红黑树的关键特性:从根到叶子的最长可能路径,不会超过最短可能路径的原创 2021-01-17 18:09:49 · 215 阅读 · 0 评论 -
JS数据结构-树结构-基本理论
一.树的术语树(tree):n(n>=0)个节点构成的有限集合,当n=0时,称为空树对于任一棵非空树(n>0),它具备以下性质:a.树中有一个称为“根(root)”的特殊节点,用r表示b.其余节点可分为m(m>0)个互不相交的有限集T1,T2,…Tm,其中每个集合本身又是一棵树,称为原来树的“子树(SubTree)”二.二叉树如果树中的每个节点最多只能有两个子节点,这样的树就称为“二叉树”。实际上,所有的树都可以用二叉树模拟出来二叉树的特性:a.一个二叉树第i层的最大原创 2021-01-14 19:59:33 · 436 阅读 · 0 评论 -
JS数据结构-对比数组、链表、哈希表和树的优缺点
一.数组优点:数组的主要优点是根据下标值访问效率会很高但是当我们希望通过内容来查找元素的对应位置时,比较好的方法是先对数组进行排序,然后二分查找(时间复杂度为O(logN))缺点:需要先对数组进行排序,生成有序数组,才能提高查找效率另外数组在删除和插入数据时,需要有大量的位移操作,效率很低二.链表优点:链表的插入和删除操作效率都很高缺点:查找效率很低,需要从头开始依次访问链表中的每个数据项,直到查找成功,即线性查找(时间复杂度为O(N))即使插入和删除效率都很高,但是如原创 2021-01-12 20:07:19 · 1396 阅读 · 0 评论 -
JS数据结构-哈希表-基本操作
一.哈希表实现原创 2021-01-11 20:37:38 · 443 阅读 · 0 评论 -
JS数据结构-哈希表-扩容操作
一.哈希表扩容HashTable.prototype.resize = function(newLimit){ // 1.保存旧的数组内容 var oldStorage = this.storage // 2.重置所有的属性 this.storage = [] this.count = 0 this.limit = newLimit // 3.遍历oldStorage中所有的bucket for(var i = 0; i < oldStorage.length; i++){原创 2021-01-11 17:37:58 · 306 阅读 · 0 评论 -
JS数据结构-哈希表-冲突的两种解决方法及哈希函数的设计
一.字典字典的主要特点是一一对应的关系,即存储的是键值对使用数组的方式:[18,‘coderwhy’,1.88],可以通过下标值取出信息使用字典的方式:{‘age’:18,‘name’:‘coderwhy’,‘height’:1.88},可以通过key取出value另外字典中的key是不可以重复的,但是value可以重复,并且字典中的key是无序的有些编程语言将这种映射关系称为字典,而有些编程语言将其称为Map...原创 2020-12-28 21:45:47 · 492 阅读 · 0 评论 -
JS数据结构-集合-常见操作
一.集合集合通常是由一组无序的,不重复的元素构成集合可以看做是特殊的数组特殊之处在于里面的元素没有顺序,也不能重复没有顺序意味着不能通过下标值进行访问,不能重复意味着相同的对象在集合中只会存在一份二.集合的封装function Set(){ // 属性 this.items = {} // 方法}add方法:在集合中添加元素// add方法Set.prototype.add = function(value){ // 判断当前集合中是否已经包含了该元素(使用Set的ha原创 2020-12-24 20:47:40 · 579 阅读 · 0 评论 -
JS数据结构--双向链表--常见操作
一.单向链表的缺点在单向链表中,可以轻松的从头遍历到尾部,到达下一个节点,但是想回到前一个节点是很难的。二.双向链表既可以从头遍历到尾,又可以从尾遍历到头链表相连的过程是双向的一个节点既有向前连接的引用,也有一个向后连接的引用双向链表可以解决单向链表的缺点三.双向链表的缺点每次在插入或删除某个节点时,需要处理四个引用,而不是两个,实现起来相对困难与单向链表相比,占用内存空间更大...原创 2020-12-23 20:04:27 · 135 阅读 · 0 评论 -
JS数据结构--单向链表--常见操作
一.链表的特点当需要存储多个元素时,除了使用数组外,另外一个选择就是链表链表中的元素在内存中所获取的内存空间不必是连续的链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有些语言称之为指针或者连接)组成二.链表的优缺点相对于数组,链表有一些优点:内存空间不是必须连续的,可以充分利用计算机的内存,实现灵活的内存动态管理链表不必在创建时就确定大小,并且大小可以无限延伸下去链表在插入和删除数据时,时间复杂度可以达到O(1),相对数组效率高很多。而数组在修改和查找元素方面效率较原创 2020-12-13 18:59:20 · 179 阅读 · 0 评论 -
js数据结构--队列--常见操作
一.队列特性:先进先出在后端添加数据,在前端删除数据常见应用场景:打印机、线程工作二.队列的实现队列类的创建:基于数组和基于链表以下是基于数组实现的:function Queue(){ //属性 this.items = [] //方法 // 1.将元素加入到队列中 Queue.prototype.enqueue() = function(element){ this.items.push(element) } // 2.从队列中删除前端元素 Queue.proto原创 2020-12-02 15:38:44 · 209 阅读 · 0 评论 -
JS数据结构--栈--常见操作
一.栈的基本操作栈可以通过存放数组或链表来实现1.通过数组实现// 封装栈类function Stack(){ // 栈中的属性 this.items = [] // 栈的相关操作 // 1.将元素压入栈 Stack.prototype.push() = function(element){ this.items.push(element) } // 2.从栈中取出元素 Stack.prototype.pop() = function(){ return this.it原创 2020-12-02 12:20:40 · 134 阅读 · 0 评论