排序思想
每次将未排序数组中的第一个元素与后面的元素依次比较,将最小的数据记录下来,然后同未排序数组中的第一个元素交换。
代码实现
selectSort(arr) {
if(!arr.length) return []
for(let i = 0; i < arr.length - 1; i++) {
let minIndex = i
for(let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]){
minIndex = j
}
}
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
}
console.log(arr)
}
代码解析 (从小到大排序)
- 判断传进来的参数长度是否大于零
- 第一层for循环,使用变量minIndex记录当前第一个数据的索引,变量i的作用是控制内层循环的遍历次数,为什么要使用arr.length-1? 原因是内层循环中的变量j 总是比外层循环变量i大1,避免内层循环判断逻辑出错(找不到值),所以这里为数据长度减一。
- 内层循环,变量j为什么要在变量i的基础上加1? 此排序的思想是未排序的元素与后面的元素依次比较, 所以要在i的基础上加一,即与它后面的进行比较。
- 遍历长度为arr.length,这个没什么好解释的,全量比较。
- 内层循环中的判断,如果前面元素(arr[minIndex])大于后面的元素(arr[j]),将后面元素的索引j赋值给minIndex, 然后继续遍历,一直遍历到最后一个元素,此时minIndex变量保存的是此轮遍历中最小的那个值的索引。
- 最后将遍历出来的最小值与当前未排序的值(索引为i的值)进行交换。
- 重复以上步骤。