选择排序也是一种比较经典而且简单的排序方法,他主要的原理是从数组中一遍一遍的找最小的值,然后把最小的值放到最前边的方式来进行排序。
类似的,我们也可以把js中数组的元素进行排序,先取出第一个数,然后在把第一个数挨个和剩余的数进行比较。
代码:
function selectSort(arr){
// 先定义两个遍历,
// minIndex 用来存储最小的数值的下标
// temp用来存储临时数据做交换用
let minIndex, temp;
// 记录数组长度
let len = arr.length;
// 外层循环遍历到数组的倒数第二个
for(let i = 0;
i < len - 1;
i++){
// 先把最小值的下标赋值给当前外层循环的下标
minIndex = i;
// 内层循环,从外层循环的i+1个开始,循环到数组末尾
for(let j = i + 1;
j < len;
j++){
// 判断记录的最小项和当前项的大小,如果大于当前项
if(arr[minIndex] > arr[j]){
// 就把最小值的下标改成当前项的下标
minIndex = j;
}
}
// 然后进行数据交换,先把外层循环的当前项的数据存到临时变量
temp = arr[i];
// 然后把这次循环最小的值赋值给当前项
arr[i] = arr[minIndex];
// 然后再把当前项的值赋值到最小值的位置
arr[minIndex] = temp;
}
// 最后返回最终排序的数组
return arr;
}
console.log(selectSort([40, 10, 30, 6, 65]));
执行过程
【算法|js算法学习——选择排序】上边的代码执行流程是:原数组:
[40, 10, 30, 6, 65]
- 外层循环从数组下标为0开始循环,循环到下标为数组的倒数第二个;
- 内层循环从外层循环的下一个开始循环到数组的最后一个数;
- 初始化变量,
minIndex
和temp
- 外层循环第一次
i=0; i< length-1(5-1=4);minIndex = 0
;- 内层循环第一次
j=i+1(0+1=1); j
; 然后比较 arr[minIndex](40)
和arr[1](10)
大小,40>10,那么把10的下标赋值给minIndex=1
; - 内层循环第二次
j=2; j
;然后比较 arr[minIndex](10)
和arr[2](30)
大小10<30
,所以不进行处理 - 内层循环第三次
j=3; j
; 然后比较 arr[minIndex](10)
和arr[3](6)
大小10>6,那么把6的下标复制给minIndex=3
; - 内层循环第四次
j=4;j
然后比较 arr[minIndex](6)
和arr[4](65)
大小,6<65,那么不进行处理 - 内层循环第五次
j=5; j
条件不成立结束内层循环
然后进行赋值操作,先把arri的数据存下来,然后把最小项的值赋值给当前位置然后在把40赋值到最小项的位置得到的数组为[6, 10, 30, 40, 65]
- 内层循环第一次
- 外层循环第二次
i=1; i< length-1(5-1=4)
;minIndex = 1
;
- 内层循环第一次
j=i+1(1+1=2); j
; 然后比较 arr[minIndex](10)
和arr[2](30)
大小,10<30,所以不进行处理;- 内层循环第二次
j=3; j
;然后比较 arr[minIndex](10)
和arr[3](40)
大小 10<40,所以不进行处理 - 内层循环第三次
j=4; j
; 然后比较 arr[minIndex](10)
和arr[4](65)
大小10<65,所以也不进行处理 - 内层循环第四次
j=5; j
条件不成立结束内层循环 - 然后进行赋值操作,先把
arr[i](10)
的数据存下来,然后把最小项的值赋值给当前位置然后在把10赋值到最小项的位置得到的数组为[6, 10, 30, 40, 65]
…
- 内层循环第二次
推荐阅读
- 算法|[JS][dfs]题解 | #迷宫问题#
- Web|动态创建表格案例
- Web|Web API 实用案例
- Web|Web APIs 实用案例
- JavaScript|JavaScript循环及案例
- JavaScript|JavaScript数据类型
- leetcode|leetcode:词典中最长的单词
- LeetCode笔记|力扣4.寻找两个正序数组的中位数(java)
- 数据库|30 道 MySQL 面试题全放送!