选择排序(先看核心代码便于理解)
选择排序的核心就是数组的每一次循环都将确定一个位置的数,循环结束后整个数组的顺序也就确定了。
例子
数组:【5,3,1】从小到大
遍历第一次:从【5,3,1】确定数组第一个位置为 1 并交换位置
遍历第二次:从【3,5】确定数组第二个位置为3 并交换位置
遍历第三次:从【5】确定数字第三个位置为5 并交换位置
思路
由例子就可以知道,遍历一个数组,长度为N
第一次遍历从数组 0 ~ N - 1 中找到第一个位置的数
第二次遍历从数组 1 ~ N - 1 中找到第二个位置的数
第三次遍历从数组 2 ~ N - 1 中找到第三个位置的数
................................................................................
第N次遍历从数组 N - 1中找到N-1个位置的数
以从小到大排序为例子,i为下标
第一个for循环就是确认第 i 小的位置
第二个for循环就是为了从 i ~ N - 1 中找到第 i 小的位置
详细可看核心代码理解
交换位置函数
const swap = (arr, i, j) => {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
};
核心代码
// 选择排序
for (let i = 0; i < arr.length; i++) {
let cur = arr[i];
let index = i;
for (let j = i + 1; j < arr.length; j++) {
if (cur > arr[j]) {
index = j;
}
}
swap(arr, i, index);
}
思路
外层的每一次循环都将确定一个位置的数,但与冒泡排序确定的方向不同,选择排序是从头开始确定,冒泡排序是从后开始确定。
以从小到大排序为例,N为数组长度
外层for循环就是确认第 i 的位置
内层for循环就是为了从 0~ i 中 找到第 i 小的数
找到后就交换位置