选择排序逻辑个人理解

选择排序的个人理解:

  • 先假定数组中的第 0 个就是最小的数字的索引

  • 然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引

  • 直到数组遍历结束后,就能找到最小的那个索引,然后让最小的索引换到第 0 个的位置

  • 再来第二趟遍历,假定第 1 个是最小的数字的索引

  • 在遍历一次数组,找到比我小的那个数字的索引

  • 遍历结束后换个位置

  • 依次类推,也可以把数组排序好

    1.准备一个数组

    let data =											//定义一个数组
                [
                    { name: "张三", score: 98 },
                    { name: "李四", score: 78 },
                    { name: "王五", score: 34 },
                    { name: "静香", score: 81 },
                    { name: "胖虎", score: 18 },
                    { name: "大雄", score: 8 },
                    { name: "小夫", score: 88 },
                    { name: "柯南", score: 100 },
                    { name: "小福贵", score: 68 }
                ]
    

    2.假定数组中的第0个是最小数字的索引

    let min = 0;
    

    3.遍历数组,判断,只要数字比我小,那么就替换掉原先记录的索引

    let min = 0
    for (let i = 0; i < data.length; i++) {
      if (data[i] < data[min]) {
        min = i
      }
    }
    
    // 遍历结束后找到最小的索引
    // 让第 minIndex 个和第 0 个交换
    let temp = data[min]
    data[min] = data[0]
    data[0] = temp
    

    4.按照数组的长度重复执行上面的代码

    for (let j = 0; j < data.length; j++) {
      // 因为第一遍的时候假定第 0 个,第二遍的时候假定第 1 个
      // 所以我们要假定第 j 个就行
      data min = j
      
      // 因为之前已经把最小的放在最前面了,后面的循环就不需要判断前面的了
      // 直接从 j + 1 开始
      for (let i = j + 1; i < data.length; i++) {
        if (data[i] < data[min]) {
          min = i
        }
      }
    
      // 遍历结束后找到最小的索引
      // 第一堂的时候是和第 0 个交换,第二趟的时候是和第 1 个交换
      // 我们直接和第 j 个交换就行
      let temp = data[min]
      data[min] = data[j]
      data[j] = temp
    }
    

    5.一些优化

    和之前一样,倒数第二次排序完毕以后,就已经排好了,最后一次没有必要了

    for (let j = 0; j < data.length - 1; j++) {
      let min = j
      
      for (let i = j + 1; i < data.length; i++) {
        if (data[i] < data[min]) {
          min = i
        }
      }
    
      let temp = data[min]
      data[min] = data[j]
      data[j] = temp
    }
    

    在交换变量之前,可以判断一下,如果我们遍历后得到的索引和当前的索引一致

    那么就证明当前这个就是目前最小的,那么就没有必要交换

    做一我们要判断,最小作引和当前作引不一样的时候,才交换

    最后整体JS代码如下:

    <!-- 选择排序 -->
    <script>
        let data =											//定义一个数组
            [
                { name: "张三", score: 98 },
                { name: "李四", score: 78 },
                { name: "王五", score: 34 },
                { name: "静香", score: 81 },
                { name: "胖虎", score: 18 },
                { name: "大雄", score: 8 },
                { name: "小夫", score: 88 },
                { name: "柯南", score: 100 },
                { name: "小福贵", score: 68 }
            ]
        for (let j = 0; j < data.length-1; j++) {			//第二层循环
            let min = j;
            for (let i = j + 1; i < data.length; i++) {
                if (data[i].score < data[min].score) {
                    min = i;
                }
            }
            [data[j],data[min]]=[data[min],data[j]]			//用数组的元素置换简化额外付临时值的操作
        }
        console.log(data);

    </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值