对于经典算法,你是否也遇到这样的情形:学时以为很清楚,可过阵子就忘了?javascript
本系列文章就尝试解决这个问题。java
研读那些排序算法,细品它们的名字,其实都很贴切。算法
好比冒泡排序就很形象,遍历n次,每次循环相邻元素两两比较,把其中大的元素日后放。例如:函数
上图演示了冒泡过程的第一次循环。其中,最大的元素5就像气泡同样逐步上升到最后一位。优化
咱们把上述过程直接翻译成代码:ui
let array = [5, 4, 3, 2, 1]
for (let i = 0; i < array.length - 1; i++) {
if (array[i] > array[i+1]) {
swap(array, i, i+1)
}
}
console.log(array) // [4, 3, 2, 1, 5]
复制代码
其中swap函数封装了两个元素如何交换:spa
function swap(array, i, j) {
[array[i], array[j]] = [array[j], array[i]]
}
复制代码
第一次遍历会把最大的元素放到倒数第一个位置上,第二次遍历会把第2大的元素放倒数第二个位置上。翻译
其他次数,以此类推。此时,咱们也很容易把这n次遍历写出来:code
for (let j = 0; j < array.length; j++) {
for (let i = 0; i < array.length - 1; i++) {
if (array[i] > array[i+1]) {
swap(array, i, i+1)
}
}
}
复制代码
上述代码,还有优化的空间,好比第2次遍历时,元素4和5实际上是不须要再比较的。由于上一次已经把未排好序中最大的数据挑走了。查看完整代码:codepen。cdn
至此,冒泡排序原理和实现已经说完了。
这里总结一下,冒泡排序不须要额外空间,是本地排序,相等元素是不会交换先后顺序,于是也是稳定排序,时间复杂度为O(n^2),适用于少许数据排序,但实际中用得很少。
冒泡排序,要作到能分分钟手写出来,是须要掌握其排序原理的。每次遍历核心是相邻两两比较,一旦内层遍历能写出来,那么总体就很容易写出来,不须要死记硬背的。
但愿有所帮助,本文完。