首页 > 其他分享 >选择排序

选择排序

时间:2023-04-18 21:24:05浏览次数:46  
标签:name min 选择 索引 score let 排序 data

选择排序的个人理解:

  • 先假定数组中的第 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>

标签:name,min,选择,索引,score,let,排序,data
From: https://www.cnblogs.com/zerotwo-zrx/p/17331150.html

相关文章

  • 手撕排序算法之选择排序
    前言选择排序算法有两种,一种是直接选择排序,另一种是堆排序。他们的算法思想都离不开选择二字,其中堆排序比选择排序的更加快捷。一、直接选择排序1.排序思想以升序为例遍历数组,找到数组中最小的元素放到最前面,在从剩下的数组元素中找到最小的,依次放入,当只剩下一个元素时,已经排好。2.......
  • 排序算法-基数排序
    基数排序RadixSort1.RadixSort介绍RadixSort属于“分配式排序”(DistributionSort),又称“桶子法”(BucketSort),其是通过比较待排序序列的所有元素的各个位的值,将元素分配至“桶”中,以达到排序的目的。RadixSort是一种效率较高且稳定的排序算法,其是桶排序的扩展。RadixSor......
  • 初次排序算法学习
    直接选择排序:思路:从数组中挑出最小(最大)的数,与数组第一位(最后一位)交换位置,然后依次进行,直到最后两个元素比较完毕为止。实现:声明一个中间变量max,用于存放最大值;声明一个变量m,用于存放最大值对应的序号。外侧循环次数是n-1,n是数组元素个数,意思是挑出n-1个最大值,剩下的自然是最......
  • 基于GOA蚱蜢优化算法的KNN分类器最优特征选择matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要蝗虫优化算法(GrasshopperOptimizationAlgorithm,GOA)是一种新型的元启发式算法,由Mirjalili等人于2017年提出。该算法受幼虫和成年蝗虫大范围移动与寻找食物源的聚集行为启发,具有操作参数少,公式简单......
  • 基于GOA蚱蜢优化算法的KNN分类器最优特征选择matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要       蝗虫优化算法(GrasshopperOptimizationAlgorithm,GOA)是一种新型的元启发式算法,由Mirjalili等人于2017年提出。该算法受幼虫和成年蝗虫大范围移动与寻找食物源的聚......
  • 选择私有云解决方案,需要考虑哪些要素
    也许你觉得会花费比较贵,其实这点企业勿需担心,企业目前拥有很多选择很多,相信可以找到一个既适合企业自身业务、又能满足成本效益需求的私有云解决方案。不过,在选择私有云解决方案时,不要忘了迁移至云端的初衷:虚拟化、安全性和开放性。·虚拟化:一个真正的自服务私有云应将所有存储系统......
  • 离散型制造企业如何选择MES系统
    随着MES系统越来越被企业所重视,并并被运用到很多不同行业的制造业中。MES对于制造企业来说,其所需要的要求是各不相同的,比如离散型制造企业,该如何去选择MES系统呢?什么是离散型制造企业?离散型制造企业的产品往往是由多个零件经过一系列并不连续的工序的加工最终装配而成。离散型MES......
  • js 选择器操作相关
    Javascript知识【jQuery选择器】 https://blog.csdn.net/m0_64550837/article/details/126231445 CSS选择器https://blog.csdn.net/weixin_44214326/article/details/128093869 ......
  • 【LeetCode剑指offer 03】合并两个/K个排序链表
    合并两个排序链表https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4,1->3->4输出:1->1->2->3->4->4限制:0<=链表长度<=1000思路代码classSolutio......
  • edge浏览器选择配置文件启动
    最近在ubuntu上用edge浏览器,多配置文件的时候不管是启动还是切换都比较麻烦。因为微软的edge是基于Chromium开源项目,谷歌浏览器也是。以前在用谷歌浏览器的时候用过一些奇技淫巧应该在edge上也有效,索性自己摸索着改了一下edge的启动方式。确定配置文件百度找到了这个文章c#-S......