一、简介:
- 时间复杂度: O(n²)
- 空间复杂度: O(1)
- 稳定性:不稳定
- 优点:空间复杂度低,占用内存较少
- 缺点: 时间复杂度太高,执行效率差,且不稳定
二、核心思想
- 关注点应该在未排序部分
- 未排序中找到最小值放到已经排好序的末尾
- 两层循环,每层循环的作用是啥? 这里调皮下,代码里有注释,自己看!!!
三、排序过程的动图
红色:未排序中最小值 (会变,开始是假设值,后面变成真正的最小值)
绿色:与假设值对比的值
黄素:已排序部分
蓝色:未排序部分
四、代码实现
代码地址:github.com/shubenwumin…
我会把注释写的详细点。大家结合我的注释和动图及核心思想,一定可以很快弄懂的。
通用交换位置的函数:
const changePos = function (arr, index1, index2) {
arr[index1] = arr.splice(index2, 1, arr[index1])[0];
}
具体代码:
const selectSort = function (arr) {
let length = arr.length;
let minIndex;
// 该循环作用:将未排序部分中确立的最小值,放到排序好的末尾
for (let i = 0; i < length -1; i++) {
// 假设未排序部分最小值为未排序部分的第一个元素即i;
minIndex = i;
// 该循环作用:与假设的最小值对比,确立真正的最小值的下标
for (let j = i + 1; j < length; j++) {
if(arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 关键步骤来了,讲得到的最小值放到未排序部分的首位 或者 理解成放到排好序部分的末尾;
changePos(arr, i, minIndex);
}
return arr;
}