前端开发必会的JS算法之选择排序
上一篇我们说了经典排序中的冒泡排序,本文我们来看一下选择排序,所谓“选择”,就是每次遍历时,选择一个最小的交换到已排好序列的后面。

上图演示了第三次遍历,此时元素 1 和 2 已经排好序,再在剩下的元素中找到最小的元素 3,然后与目标位置交换。
可以看出该算法的核心是:如何在未排好序的元素中找到最小的元素?
这一点难不倒我们,熊瞎子劈苞米,搞个变量记录最小下标。
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 函数封装了两个元素如何交换:
function swap(array, i, j) {
[array[i], array[j]] = [array[j], array[i]]
}
每次遍历都排好一个最小的,n 次遍历就能排好所有,可以轻松写出代码:
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 次就行了,因为最后一次,必然剩下了一个元素,不需要再做处理。查看完整代码:
const utils = {
swap(array, a, b) {
[array[a], array[b]] = [array[b], array[a]]
},
randomNum() {
return Math.floor(Math.random() * 100)
},
randomArray() {
return Array.from(Array(this.randomNum()), _ => this.randomNum())
}
}
function selectionSort(array) {
for (let i = 0; i < array.length - 1; i++) {
let minIndex = i
for (let j = i; j < array.length; j++) {
if (array[minIndex] > array[j]) {
minIndex = j
}
}
if (minIndex !== i) {
utils.swap(array, i, minIndex)
}
}
return array
}
const array = selectionSort(utils.randomArray())
console.log(array)
至此,选择排序原理和实现已经说完了。
这里总结一下,选择排序不需要额外空间,是本地排序,相等元素是不会交换前后顺序,因而也是稳定排序,时间复杂度为 O(n^2),适用于少量数据排序,但实际中用得不多。
选择排序,要做到能分分钟手写出来,是需要掌握其排序原理的。每次遍历核心是找到最小元素然后与目标位置交换即可,一旦内层遍历能写出来,那么整体就很容易写出来,不需要死记硬背的。
以上就是前端开发必会的 JS 算法之选择排序的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持码云笔记!
以上关于前端开发必会的JS算法之选择排序的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 前端开发必会的JS算法之选择排序

微信
支付宝