js算法学习——选择排序

选择排序也是一种比较经典而且简单的排序方法,他主要的原理是从数组中一遍一遍的找最小的值,然后把最小的值放到最前边的方式来进行排序。
类似的,我们也可以把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]));

执行过程

上边的代码执行流程是:原数组:[40, 10, 30, 6, 65]

  • 外层循环从数组下标为0开始循环,循环到下标为数组的倒数第二个;
  • 内层循环从外层循环的下一个开始循环到数组的最后一个数;
  • 初始化变量,minIndextemp
  1. 外层循环第一次i=0; i< length-1(5-1=4);minIndex = 0;
    • 内层循环第一次j=i+1(0+1=1); j<length(5); 然后比较arr[minIndex](40)arr[1](10)大小,40>10,那么把10的下标赋值给minIndex=1;
    • 内层循环第二次j=2; j<length(5);然后比较arr[minIndex](10)arr[2](30)大小10<30,所以不进行处理
    • 内层循环第三次j=3; j<length(5);然后比较arr[minIndex](10)arr[3](6)大小10>6,那么把6的下标复制给minIndex=3;
    • 内层循环第四次j=4;j<length(5);然后比较arr[minIndex](6)arr[4](65)大小,6<65,那么不进行处理
    • 内层循环第五次j=5;j<length(5)条件不成立结束内层循环
      然后进行赋值操作,先把arri的数据存下来,然后把最小项的值赋值给当前位置然后在把40赋值到最小项的位置得到的数组为[6, 10, 30, 40, 65]
  2. 外层循环第二次i=1; i< length-1(5-1=4)minIndex = 1;
  • 内层循环第一次j=i+1(1+1=2); j<length(5); 然后比较arr[minIndex](10)arr[2](30)大小,10<30,所以不进行处理;
    • 内层循环第二次j=3; j<length(5);然后比较arr[minIndex](10)arr[3](40)大小 10<40,所以不进行处理
    • 内层循环第三次j=4; j<length(5);然后比较arr[minIndex](10)arr[4](65)大小10<65,所以也不进行处理
    • 内层循环第四次j=5;j<length(5)条件不成立结束内层循环
    • 然后进行赋值操作,先把arr[i](10)的数据存下来,然后把最小项的值赋值给当前位置然后在把10赋值到最小项的位置得到的数组为[6, 10, 30, 40, 65]

这样循环完毕后就把最小值放到了前边,最大值放到了后边实现了选择排序。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值