JS 剖析选择排序思路

选择排序代码

(代码不是重点,重点是思路)

<!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;

这里的易错点在于,要先将最大值移过去,为什么?因为我们建立的是最小值的容器,假如我们先让最小值过去,最大值就会被覆盖消失,那这容器还有什么意义呢?所以我们要先移最大值再去移动最小值。难点就是有一点点绕,梳理清楚就好。
有什么问题评论区给我留言吧(* ^ ▽ ^ *)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值