1、排序算法时间复杂度
最好 | 最差 | 平均 | |
直接插入排序 | O(n) | O(n2) | O(n2) |
折半插入排序 | O(nlog2n) | O(n2) | O(n2) |
希尔排序 | O(nlog2n) | ||
冒泡排序 | O(n) | O(n2) | O(n2) |
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) |
简单选择排序 | O(n2) | ||
堆排序 | O(nlog2n) | ||
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) |
2、二叉树前序、中序、后序、层次比那里算法
中序遍历(递归实现)
let inOrderTraversal = function(root,arr=[]){
if(root){
inOrderTraversal(root.left,arr);
arr.push(root.val);
inOrderTraversal(root.right,arr);
}
return arr;
}
前序遍历(递归实现)
let preOrderTraversal = function(root,arr=[]) {
if(root){
arr.push(root.val);
preOrderTraversal(root.left,arr);
preOrderTraversal(root.right,arr);
}
return arr
};
后序遍历(递归实现)
let postOrderTraversal = function(root,arr=[]) {
if(root){
postOrderTraversal(root.left,arr);
postOrderTraversal(root.right,arr);
arr.push(root.val);
}
return arr
}
层次遍历(队列方式实现)
var levelOrder = function(root) {
let result = []
if (!root) return result
let queue = [root]
let res = []
let items = []
while (queue.length != 0 || items.length != 0) {
if (!queue.length) {
queue = items
result.push(res)
items = []
res = []
}
let nowRoot = queue.shift()
if (nowRoot) {
res.push(nowRoot.val);
items.push(nowRoot.left)
items.push(nowRoot.right)
}
}
return result
};
思路解析
●同样result用来承接最后结果,queue承接当前层的全部节点,作为队列去使用,res去承接当前层queue中取出的节点的val值,items用来承接下一层的全部节点
●判断root是都为空,和上面一样就不详细解析
●进入循环,只有当当前层的节点遍历完毕并且没有下一层节点的情况下才会跳出循环
●当前层节点没有全部取出(queue的长度不为0),则取出queue中的第一个节点,节点不为null的话将当前节点的val值push如res,并获取其左右节点push入items
●当queue全部取出,说明当前层的节点已经全部遍历完毕,每个节点的val在res数组中,每个节点的左右节点在items中。我们将items赋值给queue来遍历下一层的全部节点,将res整个数组push入result结果集中,并重置items与res。
●当前层遍历完毕并且当前层全部节点都没有子节点,说明全部节点遍历完毕,跳出循环返回结果集