选择排序的时间复杂度和冒泡排序一样是 O(n^2),那为啥需要选择排序呢?
首先看一下冒泡排序:每一轮冒泡,需要两两比较,这样每个元素交换的次数就太多了。而选择排序是每次从中拿出最小或最大那个元素,直接换到最后一位或第一位。
function selectionSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
// minIndex用来记录最小值的下标
let minIndex = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 当循环结束,i和minIndex不相等就说明有最小元素,需要交换
if (i !== minIndex) {
arr[i, minIndex] = arr[minIndex, i]
}
}
}
因为是原地排序,所以空间复杂度是O(1);
选择排序的稳定性不好,当元素中包含多个相等值时,可能会打乱原有顺序。 比如[5,8,5,3,6],这个数组。3和第一个5交换顺序后,他就排到第二个5后面了。
所以算法没有绝对的好坏,主要看应用场景,当数组中大部分是有序时,冒泡排序效率就比选择排序高。