摘要:之前用 JavaScript 写过 "快速排序" 和 "归并排序" ,本文聊聊四个基础排序算法。(本文默认排序结果都是从小到大) 冒泡排序 冒泡排序每次循环结束会将最大的元素 "冒泡" 到最后一位。 以 [1, 5, 2, 4, 3] 为例,O(n^2) 的复杂度,总共外层循环 5 次,第一次循环结
阅读全文
摘要:关于二叉树的定义,以及什么是二叉树的三种遍历(先序遍历,中序遍历,后序遍历),不是本文关注的重点,请自行查阅相关资料。本文的重点是 如何用递归和迭代分别实现二叉树的三种遍历 。 leetcode上有三道题分别求三种遍历结果: "Binary Tree Preorder Traversal" 、 "B
阅读全文
摘要:"前文" 我们探讨了树状数组的原理。树状数组就是一种数据结构,它天生用来维护数组的 前缀和 ,从而可以快速求得某一个区间的和,并支持对元素的值进行修改。但是树状数组并非只有这一种功能,变形后它还能衍生出两个功能,本文我们就来分别讨论下树状数组这三大功能。 永远要记住,基本的树状数组维护的是数组的前缀
阅读全文
摘要:最近在学习位运算,正好把树状数组总结下,也算是能正式给 建个分类。 那么,树状数组到底有什么用呢?诚然,一样没什么卵用的东西我们学它干嘛。 下面举个树状数组的经典应用: 区间求和 。 假设我们有如下数组(数组元素从 开始): var a = [X, 1, 2, 3, 4, 5, 6, 7, 8, 9
阅读全文
摘要:"前文" 我们了解了快速排序算法的实现,本文我们来了解下另一种流行的排序算法 归并排序算法。 我们先来回顾下快排。快排的核心是找出一个基准元素,把数组中比该元素小的放到左边数组,比该元素大的放到右边数组,如果左边数组和右边数组分别有序,那么leftArray+midItem+rightArray就是
阅读全文
摘要:作为算法目录下的第一篇博文,快速排序那是再合适不过了。作为最基本最经典的算法之一,我觉得每个程序员都应该熟悉并且掌握它,而不是只会调用库函数,知其然而不知其所以然。 排序算法有10种左右(或许更多),耳熟能详的冒泡排序、选择排序都属于复杂度O(n^2)的“慢”排,而快排的复杂度达到了O(nlongn
阅读全文