数据结构与算法(javascript版本)
骑着毛驴的小猴子
哇哇哇
展开
-
冒泡排序
一、原理 从数组的第一个位置开始两两比较arr[index]和arr[index+1],如果arr[index]大于arr[index+1]则交换array[index]和array[index+1]的位置,直到数组结束; 每趟都把最大的数“浮”到了最后一个位置 时间复杂度:O(N²) 二、图解 三、代码实现function bubbleSort(arr){ for(var i = 0原创 2017-08-24 17:41:00 · 146 阅读 · 0 评论 -
检索算法 ---顺序查找
1、在数组中或者列表中查找数据有两种方式:顺序查找和二分查找。 顺序查找适用于元素随机排列的列表 二分查找适用于元素已排序的列表《效率高》 这里我们先谈顺序查找 2、顺序查找 对数组进行顺序查找 function seqSearch(arr,data){ for(var i = 0 ;i < arr.length ; i++){ if(arr[i] == data) ret原创 2017-09-06 13:05:07 · 1628 阅读 · 0 评论 -
检索算法 ---二分查找
一、定义与算法描述 如果要查找的数据是有序的,二分查找比顺序查找算法更高效。 将数组的第一个元素设置为下边界(0) 将数组最后一个元素所在的位置设置为上边界(数组长度减1) 若下边界等于或小于上边界,做以下操作: 将中点设置为上边界加下边界除以2 如果中点元素小于查询的值,则将下边界设置为中点元素所在下标+1 如果中点元素大于查询的值,则将上边界设置为中点元素所在下标-1 否则中点元素就是要查找的原创 2017-09-06 15:19:54 · 338 阅读 · 0 评论 -
检索算法 ---利用二分查找进行数据重复次数统计
一、思想 当binSearch()函数找到某个值时,如果数据集中还有其他相同的值出现,那么该函数会定位再类似值的附近。 换句话说,其他相同的值可能会出现在已找到值的左边或右边。 最简单的解决方案:写两个循环,两个都同时对数据集进行向左和向右遍历,统计重复次数。 二、代码实现function binSearch(arr, data) { var low = 0; var high =原创 2017-09-06 15:32:35 · 758 阅读 · 0 评论 -
栈
一、概述 栈内的元素只能通过一端进行访问,这一端叫做栈顶。 咖啡厅的一摞盘子就是现实生活中常见的栈的例子,只能再最上面取盘子,盘子洗干净后,也只能摞在最上面 栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构 二、对栈的操作实现类的封装function stack(){ this.dataStore = []; //保存栈内元素 this.top = 0原创 2017-09-08 18:10:18 · 293 阅读 · 0 评论 -
队列
一、概述 队列只能在队尾插入元素,在队首删除元素 队列是一种先进先出(FIFO,first-in-first-out)的数据结构 队列被应用在很多地方,如:提交操作系统执行的一系列进程、打印任务池等,一些仿真系统用队列模拟银行或杂货店里排队的顾客 二、对队列的操作基本类的封装function queue(){ this.dataStore = []; //存储队列内的元素 this.原创 2017-09-08 18:35:54 · 263 阅读 · 0 评论 -
双向链表
一、概述 单链表虽然从头结点向尾结点遍历很简单,但反过来,从后往前遍历就麻烦了 因此我们考虑通过给node结点增加一个属性,指向前驱,则从后往前遍历变得简单 在删除节点时,无需查找前驱元素,效率会有所提高 二、对象的封装 单链表中写的较详细,这儿直接贴代码,有疑问可以看看单链表那篇 插入和删除建议自己动手一边画图一遍写代码 function Node(ele){ this.element原创 2017-09-10 11:03:52 · 220 阅读 · 0 评论 -
循环链表
一、概述 循环链表与单向链表相似,唯一的区别是,在创建循环链表的时候,让其头结点的next指向本身 换句话说,让链表的尾结点指向头结点 如果想要从后往前遍历链表,又不想付出代价去创建双向链表,则可以创建一个循环链表 ,从尾结点向后移动,就等于从后往前遍历链表 二、代码展示 有疑问可以看看单链表那篇,详细 在单链表对象封装的基础上,把判断最后一个元素时判断Null改完head function原创 2017-09-10 11:40:39 · 300 阅读 · 0 评论 -
单链表
注:本篇文章中图片来自网络 一、JavaScript数组与其他编程语言数组对比 其他语言 长度固定,当数组已经被数据填满之后,再无法加入其他元素,产生越界错误 添加和删除元素麻烦,需要将数组中的其他元素向前或向后移动 JavaScript 长度不固定 splice随意添加删除元素,无需移动其他元素 二、JavaScript数组缺点 被实现成了对象,因此在实际上使用时会很慢。于是我们可以考虑用链原创 2017-09-10 10:41:36 · 231 阅读 · 0 评论 -
希尔排序
一、定义 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。 二、基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键转载 2017-09-06 12:35:44 · 174 阅读 · 0 评论 -
快速排序
一、定义快速排序也是采用分而治之的算法,通过递归的方式将所有数据分解为包含较小元素和较大元素的不同子序列。不断重复直到所有数据都是有序。二、基本思想 在数据集之中,选择一个元素作为”基准”(pivot)。 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。 三、图解原创 2017-09-06 11:59:48 · 186 阅读 · 0 评论 -
归并排序
一、定义 所谓归并排序是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)。这样的排序方法经常用于多个有序的数据文件归并成一个有序的数据文件。归并排序的算法比较简单。 二、基本思想 采用分治法的思想 假设已经有两个有序数列,分别存放在两个数组s,r中;并设i,j分别为指向数组的第一个单元的下标;s有n个元素,r有m个元素 再另设一个数组a,k指向该数组的第一个单元下标原创 2017-09-06 10:17:29 · 225 阅读 · 0 评论 -
选择排序
一、基本思想 选择排序从数组的开头开始,将第一个元素和其他元素进行比较。检查完所有元素后,最小的元素会被放在数组的第一个位置,然后算法会从第二个位置继续。这个过程一直进行,当进行到数组的倒数第二个位置时,所有的数据便完成了排序。 二、图解 三、代码实现function selectionSort(arr){ for(var i = 0;i < arr.length -1;i++){原创 2017-08-24 20:52:08 · 185 阅读 · 0 评论 -
插入排序
一、原理: 每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。 插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。 二、图解 三、代码实现 function insert原创 2017-08-25 20:16:11 · 149 阅读 · 0 评论 -
基本排序算法(冒泡、选择、插入)的效率比较
一、比较思想 冒泡、选择、插入三种排序算法的复杂度非常相似,执行效率也差不多 要确定三种算法的性能差异,采用非正式的计时系统来比较对数据集合进行排序所花费的时间 计时系统基于JavaScript中的Date对象的getTime()函数取得系统时间。 var start = new Date().getTime();getTime()函数获取的是系统时间,以毫秒为单位。 计时系统 var start原创 2017-08-25 21:30:15 · 1374 阅读 · 0 评论 -
js数组合并concat()和Array.prototype.push.apply()的性能分析
js数组合并有两个常用方法,用法如下: a.concat(b); var a=[1,2,3],b=[4,5,6]; //[1,2,3,4,5,6] 那个数组在前面合并后那个数组的元素就在前面 可以利用这个来复制一份数组,a.concat(a); 数组长度无限制,返回值是合并后的数组 千万级别的数组合并大约30毫秒 2.Array.prototype.push.apply(a,b) or a.pus转载 2017-08-25 23:53:23 · 611 阅读 · 0 评论 -
字符串
注意:js对字符串的操作,都无法修改原字符串内容,而是返回新字符串。 一、大小写转换 使用场合:忽略大小写。eg:验证码 - str.toUpperCase() - str.toLowerCase()var str = "asddjiFG"; console.log(str.toUpperCase()); //ASDDJIFG console.log(str.toLowerCase()原创 2017-08-24 17:09:13 · 163 阅读 · 0 评论 -
数组的使用(2) ---迭代器方法
迭代器方法:指对数组中的每个元素都应用一个函数,可以返回一个值、一组值、或者一个新数组。 不生成新数组的迭代器方法 ① forEach() 接收一个函数作为参数,对于数组中的每个元素都使用该函数 var num = [1,2,3,4,5,6,7] function sq(num){ console.log(num*num); } num.forEach(sq); ② ever原创 2017-08-23 13:52:52 · 1079 阅读 · 0 评论 -
数组的使用(1)
一、JavaScript中的数组定义 数组标准定义 数组是一个存储元素的线性集合,元素通过索引来进行存取,这里的索引通常为数字,计算元素之间存储位置的偏移量。 JavaScript中的数组定义 JavaScript中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,这些索引即使是数组,也会在内部被转换为字符串,因为JavaScript中对象的属性名必须是字符串。 二、数组的原创 2017-08-23 13:06:45 · 301 阅读 · 0 评论 -
数组实战应用及多种解题思路详解
一、数组累加 常规循环 function sum(arr) { var sum = 0; for(var i = 0;i<arr.length;i++){ sum += arr[i]; } return sum; } forEach遍历 function sum(arr) { var sum = 0; arr.forEach(func原创 2017-08-25 23:49:31 · 393 阅读 · 0 评论 -
二叉树与二叉查找树
一、树的相关术语 树是一种非线性的数据结构,以分层的形式存储数据 树由一组以边连接的节点组成,如下: 树的层数被定义为树的深度 二、二叉树 二叉树是一种特殊的树,规定每个节点的子节点不能超过两个 通过将子节点的个数设置为2,可以高效地在树中插入、删除、查找数据 二叉查找树是一种特殊的二叉树,相对较小的值保存在左节点上,较大的值保存在右节点上,这一特性使得查找的效率很高 三、二叉查找树的实现1原创 2017-09-12 01:36:27 · 502 阅读 · 0 评论