一、数组
//JS数组方法concat:连接2个或者更多数组,并返回结果every:对每一个元素都运行指定函数,如果每一个元素都返回true,则返回truefilter:对每一个元素都运行指定函数,返回该函数会返回true的元素组成的数组forEach:对每一个元素都运行指定函数,无返回值join:将所有数组元素连接成一个字符串indexOf:返回第一个与给定参数相等的元素的索引,木有则返回-1lastIndexOf:返回在数组中搜索到的与给定参数相等的元素的最后一个元素的索引map:对数组中的元素运行给定函数,返回每次函数调用的结果组成的数组,新数组reverse:倒置slice:传入索引值,将对应索引范围内的元素作为新数组返回some:对每一个元素都运行指定函数,如果有一个元素返回true,则返回truesort:按照字母顺序对数组进行排序,支持传入指定排序方法的函数作为参数toString:作为字符串返回valueOf:与toString类似reduce:累加器function shuffle(array) {for(var i = array.length - 1; i > 0; i--) {var j = Math.floor(Math.random() * (i + 1));var temp = array[i];array[i] = array[j];array[j] = temp;}}shuffle(Array.from('today is Monday')).join()
二、栈
function Stack(){this.items = [];Stack.prototype.push = function(element){this.items.push(element);}Stack.prototype.pop = function(){return this.items.pop();}Stack.prototype.peek = function(){return this.items[this.items.length - 1];}Stack.prototype.isEmpty = function(){return this.items.length == 0;}Stack.prototype.size = function(){return this.items.length;}Stack.prototype.toString = function(){var resultString = '';for(var i = 0;i < this.items.length;i++){resultString += this.items[i] + '';}return resultString;}}var stack = new Stack();
三、队列
function Queue(){this.items = [];Queue.prototype.enqueue = function(element){this.items.push(element);}Queue.prototype.dequeue = function(){return this.items.shift();}Queue.prototype.front = function(){return this.items[0];}Queue.prototype.isEmpty = function(){return this,items.length == 0;}Queue.prototype.size = function(){return this.items.length;}Queue.prototype.toString = function(){var resultString = '';for(var i = 0;i < this.items.length;i++){resultString += this.items[i] + '';}return resultString;}}var queue = new Queue();
//击鼓传花:function passGame(nameList, num){var queue = new Queue();for(var i = 0;i < nameList.length;i++){queue.enqueue(nameList[i]);}while(queue.size() > 1){for(var i = 0;i < num - 1;i++){queue.enqueue(queue.dequeue());}queue.dequeue();}var endName = queue.front();return nameList.indexOf(endName);}
四、链表
//单向链表function LinkedList() {function Node(data) {this.data = data;this.next = null;}this.head = null;this.length = 0;//单向链表添加LinkedList.prototype.append = function(data) {if(this.length == 0){let newNode = new Node(data);this.head = newNode;}else{let newNode = new Node(data);let current = this.head;while(current.next){current = current.next;}current = newNode;}this.length += 1;}//遍历生成字符串LinkedList.prototype.toString = function() {let current = this.head;let listString = '';while(current) {listString += current.data + '';current = current.next;}return listString;}//指定位置插入LinkedList.prototype.insert = function(position, data) {if(position < 0 || positon > this.length) return false;let newNode = new Node(data);if(positon == 0) {newNode.next = this.head;this.head = newNode;}else{let index = 0;let current = this.head;let previous = null;while(index++ < position){previous = current;current = current.next;}newNode.next = current;previous.next = newNode;}this.length += 1;return true;}//查找指定位置的值LinkedList.prototype.get = function(position) {if(position < 0 || position >= this.length) return null;let current = this.head;let index = 0;while(index++ < position) {current = current.next;}return current.data}//根据值查找位置LinkedList.prototype.indexOf = function(data) {let current = this.head;let index = 0;while(current) {if(current.data == data) {return index;}current = current.next;index += 1;}return -1;}//根据位置删除数据LinkedList.prototype.removeAt = function(position) {if(position < 0 || position >= this.length) return false;if(position == 0) {this.head = this.head.next;}else{let current = this.head;let index = 0;let previous = null;while(index ++ < position) {previous = current;current = current.next;}previous.next = current.next;}this.length -= 1;return true;}//根据值删除数据LinkedList.prototype.remove = function(data) {let position = this.indexOf(data);return this.removeAt(position);}}
//双向链表//链接是双向的,一个链向下一个元素,一个链向上一个元素,同时控制next和prev两个指针//head/tailfunction DoublyLinkedList(){function Node(data){this.data = null;this.prev = null;this.next = null;}this.head = null;this.tail = null;this.length = 0;DoublyLinkedList.prototype.append = function (data){var newNode = new Node(data);if(this.length == 0){this.head = newNode;this.tail = newNode;}else{newNode.prev = this.tail;this.tail.next = newNode;this.tail = newNode;}this.length += 1;}DoublyLinkedList.prototype.toString = function(){return this.backwardString();}DoublyLinkedList.prototype.forwardString = function(){var current = this.tail;var resultString = "";while(current){resultString += current.data + "";current = current.prev;}return resultString;}DoublyLinkedList.prototype.backwardString = function(){var current = this.head;var resultString = "";while(current){resultString += current.data + "";current = current.next;}return resultString;}DoublyLinkedList.prototype.insert = function(position, data){if(position < 0 || position > this.length) return false;var newNode = new Node(data);if(this.length == 0){this.head = newNode;this.tail = newNode;}else{if(postion == 0){this.head.prev = newNode;newNode.next = this.head;this.head = newNode;}else if(position == this.length){newNode.prev = this.tail;this.tail.next = newNode;this.tail = newNode;}else{var current = this.head;var index = 0;while(index++ < position){current = current.next;}newNode.next = current;newNode.prev = current.prev;current.prev.next = newNode;current.prev = newNode;}}this.length += 1;return true;}DoublyLinkedList.prototype.get = function(position){if(position < 0 || position >= this.length) return null;var current = this.head;var index = 0;while(index++ < position){current = current.next;}return current.data;}DoublyLinkedList.prototype.indexOf = function(data){var current = this.head;var index = 0;while(current){if(current.data == data){return index;}current = current.next;index += 1;}return -1;}DoublyLinkedList.prototype.update = function(position, newData){if(position < 0 || position >= this.length) return false;var current = this.head;var index = 0;while(index++ < position){current = current.next;}current.data = newData;return true;}DoublyLinkedList.prototype.removeAt = function(position){if(position < 0 || position >= this.length) return null;var current = this.head;if(this.length == 1){this.head = null;this.tail = null;}else{if(position == 0){this.head.next.prev = null;this.head = this.head.next;}else if(position == this.length - 1){var current = this.tail;this.tail.prev.next = null;this.tail = this.tail.prev;}else{var index = 0;while(index++ < position){current = current.next;}current.prev.next = current.next;current.next.prev = current.prev;}}this.length -=1;return current.data;}DoublyLinkedList.prototype.remove = function(){var index = this.indexOf(data);return this.removeAt(index);}}
五、集合
// 集合function Set() {this.items = {};Set.prototype.add = function(value) {if(this.has(value)) {return false;}this.items[value] = value;return true;}Set.prototype.has = function(value) {return this.items.hasOwnProperty(value);}Set.prototype.remove = function(value) {if(!this.has(value)) {return false;}delete this.items[value];return true;}Set.prototype.clear = function() {this.item = {};}Set.prototype.size = function() {return Object.keys(this.items).length;}Set.prototype.values = function() {return Object.keys(this.items);}}
六、字典
// 字典//一一对应,key不可以重复,value可以重复,key无序// 创建字典的构造函数function Dictionary() {// 字典属性this.items = {}// 字典操作方法// 在字典中添加键值对Dictionary.prototype.set = function (key, value) {this.items[key] = value}// 判断字典中是否有某个keyDictionary.prototype.has = function (key) {return this.items.hasOwnProperty(key)}// 从字典中移除元素Dictionary.prototype.remove = function (key) {// 1.判断字典中是否有这个keyif (!this.has(key)) return false// 2.从字典中删除keydelete this.items[key]return true}// 根据key去获取valueDictionary.prototype.get = function (key) {return this.has(key) ? this.items[key] : undefined}// 获取所有的keysDictionary.prototype.keys = function () {return Object.keys(this.items)}// 获取所有的valueDictionary.prototype.values = function () {return Object.values(this.items)}// size方法Dictionary.prototype.size = function () {return this.keys().length}// clear方法Dictionary.prototype.clear = function () {this.items = {}}}// 创建字典对象var dict = new Dictionay()
七、哈希表
// ##哈希表
//1.优势:非常快速的插入-删除-查找操作,比树还快
//2.缺点:数据没有顺序,不能以固定的方式来遍历
//3.哈希表究竟是个啥?
//结构就是数组,神奇于下标值的变换-哈希函数,获取HashCode
//将字符串转成下标值
//4.哈希化:将指定数据(例如key)转化为数组范围内下标的过程
//5.哈希表:将最终数据插入数组,进行封装
//6.重复问题:转化下标的过程中会出现下标相同的情况
//7.解决方案一:链地址法-也就是存入数组的是一个数组/链表
//8.解决方案二:开放地址法-继续向下寻找空白位置来放置重复数据
//9.哈希表效率更高:哈希化越好,也就是减少重复,进而要求哈希函数设计的巧妙
//霍纳法则-秦九韶算法:多项式-O(n^2) -> O(n)
//那就是哈希表就是通过将关键值也就是key通过一个散列函数加工处理之后得到一个值,这个值就是数据//存放的位置,我们就可以根据这个值快速的找到我们想要的数据
//吴磊———-(散列函数/哈希函数)———>吴
//键值对:key-value通过对key的哈希化得到一个下标,如果出现相同的下标就要进行冲突处理
//哈希函数function hashFunc(str, size) {var hashCode = 0;for(var i = 0; i < str.length; i++) {hashCode = 37 * hashCode + str.charCodeAt(i);}var index = hashCode % size;return index;}
//哈希表function HashTable() {this.storage = [];this.count = 0;this.limit = 7;HashTable.prototype.hashFunc = function(str, size) {var hashCode = 0;for(var i = 0; i < str.length; i++) {hashCode = 37 * hashCode + str.charCodeAt(i);}var index = hashCode % size;return index;}HashTable.prototype.put = function(key, value) {var index = this.hashFunc(key, this.limit);var bucket = this.storage[index];if(bucket == null) {bucket = [];this.storage[index] = bucket;}for(var i = 0; i < bucket.length; i++) {var tuple = bucket[i];if(tuple[0] == key) {tuple[1] = value;return true;}}bucket.push([key, value]);this.count += 1;}HashTable.prototype.get = function(key) {var index = this.hashFunc(key, this.limit);var bucket = this.storage[index];if(bucket == null) {return null;}for(var i = 0; i < bucket.length; i++) {var tuple = bucket[i];if(tuple[0] == key) {return tuple[1];}}return null;}HashTable.prototype.remove = function(key) {var index = this.hashFunc(key, this.limit);var bucket = this.storage[index];if(bucket == null) {return null;}for(var i = 0; i < bucket.length; i++) {var tuple = bucket[i];if(tuple[0] == key) {bucket.splice(i, 1);this.count -= 1;return tuple[1];}}return null;}//扩容,装填因子大于0.75,所有数据同时进行修改HashTable.prototype.resize = function(newLimit) {var oldStorage = this.storage;this.storage = [];this.count = 0;this.limit = newLimit;for(var i = 0; i < oldStorage.length; i++) {var bucket = oldStorage[i];if(bucket == null) {continue;}for(var j = 0; j < bucket.length; j++) {var tuple = bucket[j];this.put(tuple[0], tuple[1]);}}}//添加操作之后:if(this.count > this.limit * 0.75) {this.resize(this.limit * 1);}//删除操作之后:if(this.limit > 7 && this.count < this.limit * 0.25) {this.resize(Math.floor(this.limit / 2));}//质数判断function isPrime(num) {var temp = parseInt(Math.sqrt(num));for(var i = 2; i <= temp; i++) {if(num % i == 0) {return false;}}return true;}//实现容量恒为质数HashTable.prototype.getPrime = function(num) {while(!this.isPrime(num)) {num += 1;}return num;}}
八、树
//1.二叉树:几乎所有的树都可以表示成二叉树的形式
//2.完全二叉树:只有叶节点不是满的,且优先为左侧节点
//3.二叉搜索树(BST):
//非空左子树的所有键值小于根节点的键值
//非空右子树的所有键值大于根节点的键值
//左右子树本身也是二叉搜索树
//利用了二分查找的思想,查找所需的最大次数为BST的深度
function BinarySearchTree() {function Node(key) {this.key = key;this.left = null;this.right = null;}this.root = null;BinarySearchTree.prototype.insert = function(key) {let newNode = new Node(key);if(this.root == null) {this.root = newNode;}else{this.insertNode(this.root, newNode);}}BinarySearchTree.prototype.insertNode = function(node, newNode) {if(newNode.Key < node.key) {if(node.left == null) {node.left = newNode;}else{this.insertNode(node.left, newNode);}}else{if(node.right == null) {node.right = newNode;}else{this.insertNode(node.right, newNode);}}}}
//先序遍历:先访问根节点,然后左右子树//递归版BinarySearchTree.prototype.preOrderTraversal = function(handler) {this.preOrderTraversalNode(this.root, handler);}BinarySearchTree.prototype.preOrderTraversalNode = function(node, handler) {if(node != null) {handler(node.key);this.preOrderTraversalNode(node.left, handler);this.preOrderTraversalNode(node.right, handler);}}//使用var bst = new BinarySearchTree();var resultString = "";bst.preOrderTraversal(function(key){resultString += key + "";})alert(resultString);
//中序遍历:根节点第二次访问//递归版BinarySearchTree.prototype.inOrderTraversal = function(handler) {this.inOrderTraversalNode(this.root, handler);}BinarySearchTree.prototype.inOrderTraversalNode = function(node, handler) {if(node != null) {this.inOrderTraversalNode(node.left, handler);handler(node.key);this.inOrderTraversalNode(node.right, handler);}}
//后序遍历:先访问左右子树,最后访问根节点//递归版BinarySearchTree.prototype.postOrderTraversal = function(handler) {this.postOrderTraversalNode(this.root, handler);}BinarySearchTree.prototype.postOrderTraversalNode = function(node, handler) {if(node != null) {this.postOrderTraversalNode(node.left, handler);this.postOrderTraversalNode(node.right, handler);handler(node.key);}}
//非空左子树的所有键值小于根节点的键值//非空右子树的所有键值大于根节点的键值//所以最小值就是最左边的值BinarySearchTree.prototype.min = function() {let node = this.root;while(node.left !== null) {node = node.left;}return node.key;}//最大值也就是最右边的值BinarySearchTree.prototype.max = function() {let node = this.root;while(node.right != null) {node = node.right;}return node.key;}BinarySearchTree.prototype.search = function(key) {return this.searchNode(this.root, key);}BinarySearchTree.prototype.searchNode = function(node, key) {if(node == null) {return false;}if(node.key > key) {return this.searchNode(node.left, key);}else if(node.key < key) {return this.searchNode(node.right, key);}else{return true;}}
<br /> //删除节点:<br /> //1.找到节点<br /> //2.删除节点<br /> //叶节点:父节点的left/right为null<br /> //一个子节点:父节点指向子节点<br /> //两个子节点:右子树的最小节点去更新这个节点,将原点删除,最后返回新的引用(前驱/后继)
BinarySearchTree.prototype.remove = function(key) {var current = this.root;var parent = null;var isLeftChild = true;while(current.key != key) {parent = current;if(key < current.key) {isLeftChild = true;current = current.left;}else{isLeftChild = false;current = current.right;}if(current == null) {return false;}}
// 3.删除的结点是叶结点if (current.left === null && current.right === null) {if (current == this.root) {this.root == null} else if (isLeftChild) {parent.left = null} else {parent.right = null}}// 4.删除有一个子节点的节点else if (current.right === null) {if (current == this.root) {this.root = current.left} else if (isLeftChild) {parent.left = current.left} else {parent.right = current.left}} else if (current.left === null) {if (current == this.root) {this.root = current.right} else if (isLeftChild) {parent.left = current.right} else {parent.right = current.right}}
// 5.删除有两个节点的节点else {// 1.获取后继节点var successor = this.getSuccessor(current)// 2.判断是否是根节点if (current == this.root) {this.root = successor} else if (isLeftChild) {parent.left = successor} else {parent.right = successor}// 3.将删除节点的左子树赋值给successorsuccessor.left = current.left}return true}// 找后继的方法BinarySerachTree.prototype.getSuccessor = function (delNode) {// 1.使用变量保存临时的节点var successorParent = delNodevar successor = delNodevar current = delNode.right // 要从右子树开始找// 2.寻找节点while (current != null) {successorParent = successorsuccessor = currentcurrent = current.left}// 3.如果是删除图中15的情况, 还需要如下代码if (successor != delNode.right) {successorParent.left = successorParent.rightsuccessor.right = delNode.right}return successor;}}
九、堆
满足以下两个条件就是堆
- 堆是完全二叉树
- 堆的节点值必须大于等于或小于等于子节点的值
堆其实可以用一个数组表示,给定一个节点的下标 i (i从1开始) ,那么它的父节点一定为 A[i/2] ,左子节点为 A[2i] ,右子节点为 A[2i+1]
//插入式建堆//总是先加入到尾部,然后和父节点i/2进行比较,大或者小就进行交换function insert(key) {items.push(key)// 获取存储位置let i = items.length-1while (i/2 > 0 && items[i] > items[i/2]) {swap(items, i, i/2); // 交换i = i/2;}}function swap(items, i, j) {let temp = items[i]items[i] = items[j]items[j] = temp}
十、图
// 1.一个图G=(V,E)
// V:一组顶点
// E:一组边,连接V中的顶点
// 2.由一条边连接在一起的顶点称为相邻顶点
// 一个顶点的度是其相邻顶点的数量
// 路径是顶点的一个连续序列
// 简单路径要求不包含重复的顶点
// 环也是一个简单路径
// 无环:无环的 连通的:每两个顶点间都存在路径
// 3.有向图/无向图
// 图可以是无向的或是有向的,双向上都存在路径则是强连通的
// 4.图的表示
// 6.图的遍历
// 两种算法:广度优先搜索/深度优先搜索
// 可以寻找特定的点或寻找两个顶点之间的路径,检查图是否连通,检查图是否含有环
// 思想:必须追踪每个第一次访问的节点,并且追踪有哪些节点还没有被完全探索,需要指定第一个被访问的节点
// 完全搜索一个顶点要求我们查看该顶点的每一条边,对于连接的未被访问的标注被发现,加入待访问顶点列表
// 为了保证算法的效率,务必访问每个顶点至多两次,连通图中每条边和顶点都会被访问到
// 1.广度优先搜索:队列 存入队列,最先入队的顶点先被探索
// 先宽后深的访问顶点
// 1.创建一个队列Q
// 2.标注v为被发现的,并将v入队列Q
// 3.如果Q非空,则运行以下的步骤
// 1.将u从Q出队列
// 2.标注u被发现
// 3.将u所有未被访问过的邻点入队列
// 4.标注u为已被探索的
// 2.深度优先搜索:栈 存入栈,沿路径被探索,存在新的相邻顶点就去访问
// 先深后广的访问顶点
// 1.标注v为被发现的
// 2.对于v的所有未访问的邻点w,访问顶点w
// 3.标注v为已被探索的
function Graph() {
// 属性
this.vertex = []; // 存储顶点
this.edges = new Dictionay(); // 存储边
// 添加方法<br /> _Graph_.prototype.addVertex = function (_v_) {<br /> _this_.vertex.push(v);<br /> _this_.edges.set(v, []);<br /> }_Graph_.prototype.addEdge = function (_v_, _w_) {<br /> _this_.edges.get(v).push(w);<br /> _this_.edges.get(w).push(v);<br /> }_Graph_.prototype.toString = function () {<br /> var resultStr = ""<br /> for (var i = 0; i < _this_.vertex.length; i++) {<br /> resultStr += _this_.vertex[i] + "->"<br /> var edg = _this_.edges.get(_this_.vertex[i])<br /> for (var j = 0; j < edg.length; j++) {<br /> resultStr += edg[j] + " "<br /> }<br /> resultStr += "\n"<br /> }<br /> return resultStr<br /> }// 初始化颜色<br /> _Graph_.prototype.initColor = function () {<br /> var colors = [];<br /> for (var i = 0; i < _this_.vertex.length; i++) {<br /> colors[_this_.vertex[i]] = "white";<br /> }<br /> return colors;<br /> }// 广度优先算法<br /> _Graph_.prototype.bfs = function (_v_, _handler_) {<br /> // 1.初始化颜色<br /> var color = _this_.initColor();<br /> // 2.创建队列<br /> var queue = **new** _Queue_();<br /> // 3.将传入的顶点放入队列中<br /> queue.enqueue(v);<br /> // 4.从队列中依次取出和放入数据<br /> while (!queue.isEmpty()) {<br /> // 4.1.从队列中取出数据<br /> var qv = queue.dequeue();<br /> // 4.2.获取qv相邻的所有顶点<br /> var qEdg = _this_.edgs.get(qv);<br /> // 4.3.将qv的颜色设置成灰色<br /> color[qv] = "gray";<br /> // 4.4.将qAdj的所有顶点依次压入队列中<br /> for (var i = 0; i < qEdg.length; i++) {<br /> var a = qEdg[i];<br /> if (color[a] === "white") {<br /> color[a] = "gray";<br /> queue.enqueue(a);<br /> }<br /> }<br /> // 4.5.因为qv已经探测完毕, 将qv设置成黑色<br /> color[qv] = "black";<br /> // 4.6.处理qv<br /> if (handler) {<br /> handler(qv);<br /> }<br /> }<br /> }// 深度优先搜索<br /> _Graph_.prototype.dfs = function (_handler_) {<br /> // 1.初始化颜色<br /> var color = _this_.initColor();<br /> // 2.遍历所有的顶点, 开始访问<br /> for (var i = 0; i < _this_.vertex.length; i++) {<br /> if (color[_this_.vertex[i]] === "white") {<br /> _this_.dfsVisit(_this_.vertex[i], color, handler);<br /> }<br /> }<br /> }// dfs的递归调用方法<br /> _Graph_.prototype.dfsVisit = function (_u_, _color_, _handler_) {<br /> // 1.将u的颜色设置为灰色<br /> color[u] = "gray";<br /> // 2.处理u顶点<br /> if (handler) {<br /> handler(u)<br /> }<br /> // 3.u的所有邻接顶点的访问<br /> var uEdg = _this_.edgs.get(u)<br /> for (var i = 0; i < uEdg.length; i++) {<br /> var w = uEdg[i]<br /> if (color[w] === "white") {<br /> _this_.dfsVisit(w, color, handler)<br /> }<br /> }<br /> // 4.将u设置为黑色<br /> color[u] = "black"<br /> }<br />}<br />//##排序和搜索算法<br />//5.快排<br /> //1.首先,在数组中选择一个值作为主元,也就是数组中间的那个值<br /> //2.创建两个指针引用,左边一个指向数组的第一个值,右边一个指向数组的最后一个值<br /> //移动左指针找到一个比主元大的值,移动右指针找到一个比主元小的值,然后交换<br /> //重复这个过程,直到左指针超过右指针,这一步叫做划分操作<br /> //3.接着对划分后的小数组重复之前的步骤,最后数组完全排序<br /> // 算法复杂度:O(nlog(n))<br />// 封装ArrayList<br />function ArrayList() {<br /> _this_.array = []_ArrayList_.prototype.insert = function (_item_) {<br /> _this_.array.push(item)<br /> }_ArrayList_.prototype.toString = function () {<br /> return _this_.array.join()<br /> }_ArrayList_.prototype.bubbleSort = function () {<br /> // 1.获取数组的长度<br /> var length = _this_.array.length// 2.反向循环, 因此次数越来越少<br /> for (var i = length - 1; i >= 0; i--) {<br /> // 3.根据i的次数, 比较循环到i位置<br /> for (var j = 0; j < i; j++) {<br /> // 4.如果j位置比j+1位置的数据大, 那么就交换<br /> if (_this_.array[j] > _this_.array[j+1]) {<br /> // 交换<br /> _this_.swap(j, j+1)<br /> }<br /> }<br /> }<br /> }_ArrayList_.prototype.selectionSort = function () {<br /> // 1.获取数组的长度<br /> var length = _this_.array.length// 2.外层循环: 从0位置开始取出数据, 直到length-2位置<br /> for (var i = 0; i < length - 1; i++) {<br /> // 3.内层循环: 从i+1位置开始, 和后面的内容比较<br /> var min = i<br /> for (var j = min + 1; j < length; j++) {<br /> // 4.如果i位置的数据大于j位置的数据, 记录最小的位置<br /> if (_this_.array[min] > _this_.array[j]) {<br /> min = j<br /> }<br /> }<br /> _this_.swap(min, i)<br /> }<br /> }_ArrayList_.prototype.insertionSort = function () {<br /> // 1.获取数组的长度<br /> var length = _this_.array.length// 2.外层循环: 外层循环是从1位置开始, 依次遍历到最后<br /> for (var i = 1; i < length; i++) {<br /> // 3.记录选出的元素, 放在变量temp中<br /> var j = i<br /> var temp = _this_.array[i]// 4.内层循环: 内层循环不确定循环的次数, 最好使用while循环<br /> while (j > 0 && _this_.array[j-1] > temp) {<br /> _this_.array[j] = _this_.array[j-1]<br /> j--<br /> }// 5.将选出的j位置, 放入temp元素<br /> _this_.array[j] = temp<br /> }<br /> }_ArrayList_.prototype.shellSort = function () {<br /> // 1.获取数组的长度<br /> var length = _this_.array.length// 2.根据长度计算增量<br /> var gap = Math.floor(length / 2)// 3.增量不断变量小, 大于0就继续排序<br /> while (gap > 0) {<br /> // 4.实现插入排序<br /> for (var i = gap; i < length; i++) {<br /> // 4.1.保存临时变量<br /> var j = i<br /> var temp = _this_.array[i]// 4.2.插入排序的内存循环<br /> while (j > gap - 1 && _this_.array[j - gap] > temp) {<br /> _this_.array[j] = _this_.array[j - gap]<br /> j -= gap<br /> }// 4.3.将选出的j位置设置为temp<br /> _this_.array[j] = temp<br /> }// 5.重新计算新的间隔<br /> gap = Math.floor(gap / 2)<br /> }<br /> }ArrayList.prototype.swap = function (_m_, _n_) {<br /> var temp = _this_.array[_m_]<br /> _this_.array[_m_] = _this_.array[_n_]<br /> _this_.array[_n_] = temp<br /> }
//快排ArrayList.prototype.quickSort = function(arr) {if(arr.length <= 1) {return arr}let pivotIndex = Math.floor(arr.length / 2)let pivot = arr.splice(pivotIndex, 1)[0]let left = []let right = []for(let i = 0;i < arr.length; i++) {if(arr[i] < pivot) {left.push(arr[i])}else{right.push(arr[i])}}return quickSort(left).concat([piovt], quickSort(right))}
