这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
选择排序
- 选择排序:是一种
原址比较
的排序算法。 - 核心思想:找到数据结构中的最小值,并将其放在第一位,接着找到第二小的值,将其放在第二位,以此类推。
实现
function selectionSort(arr) {
// 记录待排序数组长度
let len = arr.length;
// 记录最小值下标
let indexMin = null;
// 外层循环迭代数组,同时控制迭代轮数
for (let i = 0; i < len - 1; i++ ) {
// 先 假设 本迭代轮次的第一个值为数组的最小值
indexMin = i
// 内层循环则从迭代值数组末尾
for (let j = i; j < len; j++) {
// 比较内层循环的当前迭代元素 是否 比外层我们假设的当前最小值 小
if(arr[indexMin] > array[j]) {
// 如果小的话,则将记录最小值的下标的变量的值更新为当前的 内存循环迭代下标,即 j
indexMin = j
}
}
// 当所有的内层迭代结束之后,则可以找到数组 第 n 小的值。
// 如果 该第n小的值和原来的最小值时不同的话,则交换位置。
if(i != indexMin) {
// 交换位置
let temp = array[i];
array[i] = array[indexMin];
array[indexMin] = temp;
}
}
}
注意:minIndex 始终保存着最小值的位置的索引
,随着i的自增,遍历的数组长度越来越短,直到完成排序。
解析:
- 比方说我们用选择排序来对
[5,4,3,2,1]
数组进行排序。 - 在外层第一次循环的时候 将 第0位作为 indexMin;
- 然后进行内层循环,从 第0 位开始循环,依次和我们假定的最小值做比较;
- 如果内层循环中的当前下标所表示的值,比我们假定的indexMin代表的值小,那么就更新 indexMin的值为 当前下标。
- 内层循环结束的时候,即可拿到此时的代表数组最小值的元素的下标。
- 然后,拿着此时更新后的indexMin 跟我们外层的当前循环下标 i做比较,不等的话则交换两者的值。
- 到此,外层一轮循环结束,此时我们数组的第0位已经变成了最小值。
- 接着。开始第二轮循环,此时内层循环则从数组的第 1 位开始,也就是外层循环的 i 值。
- 依此类推。
最后
- 选择排序,同样也是一个复杂度为O(n2)的算法。
- 和冒泡排序一样,选择排序也包含有嵌套的两个循环,这就导致了二次方的复杂度。
- 同样的,也是不推荐使用。