选择排序代码
(代码不是重点,重点是思路)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
</style>
</head>
<body>
<div id="box"></div>
</body>
<script>
var arr = [9,8,7,5,6];
console.log(arr);
// 按照索引,先确定比较次数
// 0-1,0-2,0-3,0-4 0~length-1
// 1-2,1-3,1-4 1~length-1
// 2-3,2-4 2~length-1
// 3-4 3~length-1
// 每一轮比较过程中不交换,只找最小值,一轮结束后,才能确定最小值,再交换
// 确定行的循环
for(var i=0;i<arr.length-1;i++){
// 每轮比较开始之前,假设最小值
var ls = arr[i];
// 保存最小值的索引
var lsIndex = i;
// 确定列的循环,注意 起点 和 终点
for(var j=i+1;j<arr.length;j++){
// 验证,是否是真正的最小值
if(ls > arr[j]){
// 如果不是,保存真正的最小值
ls = arr[j];
// 最小值的索引
lsIndex = j;
}
}
// 一轮结束后,确定了最小值,能拿到最小值的索引,交换
// 先将第一位,放在最小值的位置
arr[lsIndex] = arr[i];
// 再将最小值,放在第一位
arr[i] = ls;
}
console.log(arr);
</script>
</html>
理解:(这个只是便于理解我这样拆分的)
我们先不管第二个for循环,先看把第二个for循环剔除后的
var arr = [9,8,7,5,6];
console.log(arr);
// 确定行的循环
for(var i=0;i<arr.length-1;i++){
// 每轮比较开始之前,假设最小值
var ls = arr[i];
// 保存最小值的索引
var lsIndex = i;
// 先将第一位,放在最小值的位置
arr[lsIndex] = arr[i];
// 再将最小值,放在第一位
arr[i] = ls;
看完后,结果这个换来换去就是本身,是不是没意思,那么我拆开的意义是什么?想让大家明白这段代码的意义就是保存“”最小值“”(第二个for循环if执行就是最小值的替换,不执行那本来的顺序就是对的,没必要去换),那我们又如何取得最小值,下面我们看一下for循环。
for(var j=i+1;j<arr.length;j++){
// 验证,是否是真正的最小值
if(ls > arr[j]){
// 如果不是,保存真正的最小值
ls = arr[j];
// 最小值的索引
lsIndex = j;
}
}
// 一轮结束后,确定了最小值,能拿到最小值的索引,交换
// 先将第一位,放在最小值的位置
arr[lsIndex] = arr[i];
// 再将最小值,放在第一位
arr[i] = ls;
这里的易错点在于,要先将最大值移过去,为什么?因为我们建立的是最小值的容器,假如我们先让最小值过去,最大值就会被覆盖消失,那这容器还有什么意义呢?所以我们要先移最大值再去移动最小值。难点就是有一点点绕,梳理清楚就好。
有什么问题评论区给我留言吧(* ^ ▽ ^ *)