算法|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]));

执行过程
【算法|js算法学习——选择排序】上边的代码执行流程是:原数组:[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; 然后比较arr[minIndex](40)arr[1](10)大小,40>10,那么把10的下标赋值给minIndex=1;
    • 内层循环第二次j=2; j;然后比较arr[minIndex](10)arr[2](30)大小10<30,所以不进行处理
    • 内层循环第三次j=3; j; 然后比较arr[minIndex](10)arr[3](6)大小10>6,那么把6的下标复制给minIndex=3;
    • 内层循环第四次j=4;j然后比较arr[minIndex](6)arr[4](65)大小,6<65,那么不进行处理
    • 内层循环第五次j=5; j条件不成立结束内层循环
      然后进行赋值操作,先把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; 然后比较arr[minIndex](10)arr[2](30)大小,10<30,所以不进行处理;
    • 内层循环第二次j=3; j;然后比较arr[minIndex](10)arr[3](40)大小 10<40,所以不进行处理
    • 内层循环第三次j=4; j; 然后比较arr[minIndex](10)arr[4](65)大小10<65,所以也不进行处理
    • 内层循环第四次j=5; j条件不成立结束内层循环
    • 然后进行赋值操作,先把arr[i](10)的数据存下来,然后把最小项的值赋值给当前位置然后在把10赋值到最小项的位置得到的数组为[6, 10, 30, 40, 65]
这样循环完毕后就把最小值放到了前边,最大值放到了后边实现了选择排序。

    推荐阅读