1、选择排序的基本思想
每一趟遍历从待排序的数据元素中选择出最小的一个元素作为首元素,直到所有的元素排完为止。
2、代码实现
首先我们要判断传入的是否是一个数组,如果不是数组或者数组的长度小于等于1,直接返回,不需要排序
if (!Array.isArray(array) || length <= 1) return;
进行循环,暂时认为第一个元素是一个最小值,只需要得到最小值的索引,之后找到最最小值直接交换下标即可
for (let i = 0; i < length - 1; i++)
let minIndex = i; // 设置当前循环最小元素索引
如果当前循环元素比假设最小值还要小,则更新最小元素的索引
for (let j = i + 1; j < length; j++)
if (array[minIndex] > array[j]) {
minIndex = j;
}
实现一个变量交换的函数,从而实现代码的封装
function swap(array, left, right) {
var temp = array[left]; // 将数组左边的值存放在temp中
array[left] = array[right]; // 将数组右边的值覆盖数组左边的值
array[right] = temp; // 将之前存放在temp中数组左边的值赋值给数组右边的值
}
3、代码总和
function selectSort(array) {
let length = array.length;
// 如果不是数组或者数组长度小于等于1,直接返回,不需要排序
if (!Array.isArray(array) || length <= 1) return;
for (let i = 0; i < length - 1; i++) {
let minIndex = i; // 设置当前循环最小元素索引
for (let j = i + 1; j < length; j++) {
// 如果当前元素比最小元素索引,则更新最小元素索引
if (array[minIndex] > array[j]) {
minIndex = j;
}
}
// 交换最小元素到当前位置
// [array[i], array[minIndex]] = [array[minIndex], array[i]];
swap(array, i, minIndex);
}
return array;
}
// 交换数组中两个元素的位置
function swap(array, left, right) {
var temp = array[left];
array[left] = array[right];
array[right] = temp;
}
4、输出结果
5、总结
选择排序不管初始序列是否有序,时间复杂度都为 O(n²)。
选择排序的平均时间复杂度为 O(n²) ,最坏时间复杂度为 O(n²) ,空间复杂度为 O(1) ,不是稳定排序。