选择排序
1 动画
2 思想
在未排序序列中找到最小的元素,放到已排序序列的末尾。
又或者这么说,找到整个序列中的第小值放至第一位,接着找到第二小的值并将其放至第二位,以此类推。
3 解法
const selectionSort = arr => {
const length = arr.length
let minIndex, temp
for (let i = 0; i < length - 1; i++) { // 循环 length-1 次
minIndex = i // 保存一轮中最小的数索引
for (let j = i + 1; j < length; j++) { // 从未排序序列的第一位开始找
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
// 将最小的数放到已排序序列末尾
if (minIndex != i) {
temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
}
return arr
}
4 分析
时间复杂度
-
最佳情况:
O(n²)
-
最差情况:
O(n²)
-
平均情况:
O(n²)
稳定性
不稳定。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。
参考资料:
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总
- awesome-coding-js
- 理解选择排序的不稳定性
- 《学习JavaScript数据结构与算法(第3版)》