对于经典算法,你是否也遇到这样的情形:学时以为很清楚,可过阵子就忘了?javascript
本系列文章就尝试解决这个问题。java
研读那些排序算法,细品它们的名字,其实都很贴切。算法
好比选择排序,所谓“选择”,就是每次遍历时,选择一个最小的交换到已排好序列的后面。markdown
上图演示了第三次遍历,此时元素1和2已经排好序,再在剩下的元素中找到最小的元素3,而后与目标位置交换。函数
能够看出该算法的核心是:如何在未排好序的元素中找到最小的元素?oop
这一点难不倒咱们,熊瞎子劈苞米,搞个变量记录最小下标。post
let array = [1, 2, 4, 5, 3] let minIndex = 2 for (let i = 2; i < array.length; i++) { if (array[minIndex] > array[i]) { minIndex = i } } console.log(minIndex) // 4 复制代码
找到了最小元素,而后再与目标位置的数据进行交换便可(若是刚好正在目标位置就不用交换了):优化
if (minIndex !== 2) { swap(array, 2, minIndex) } console.log(array) // [1, 2, 3, 5, 4] 复制代码
其中swap函数封装了两个元素如何交换:spa
function swap(array, i, j) { [array[i], array[j]] = [array[j], array[i]] } 复制代码
每次遍历都排好一个最小的,n次遍历就能排好全部,能够轻松写出代码:code
let array = [4, 5, 3, 2, 1] for (let j = 0; j < array.length; j++) { let minIndex = j for (let i = j; i < array.length; i++) { if (array[minIndex] > array[i]) { minIndex = i } } if (minIndex !== j) { utils.swap(array, j, minIndex) } } 复制代码
完整流程示意以下:
上述代码,还有优化的空间,好比只须要遍历n-1次就好了,由于最后一次,必然剩下了一个元素,不须要再作处理。查看完整代码:codepen。
至此,选择排序原理和实现已经说完了。
这里总结一下,选择排序不须要额外空间,是本地排序,相等元素是不会交换先后顺序,于是也是稳定排序,时间复杂度为O(n^2),适用于少许数据排序,但实际中用得很少。
选择排序,要作到能分分钟手写出来,是须要掌握其排序原理的。每次遍历核心是找到最小元素而后与目标位置交换便可,一旦内层遍历能写出来,那么总体就很容易写出来,不须要死记硬背的。
但愿有所帮助,本文完。
本系列已经发表文章: