每天一个面试点!

118 阅读2分钟

选择排序

我先上一串代码先:

  let minIndex, temp  //  定义两个空变量   后期赋值使用   默认是undefined
  for (let i = 0; i < arr.length - 1; i++) {  // 我个人理解为让里面的循环  能循环这个数组的length - 1 次
    minIndex = i  // 为下面找出最小值做的铺垫也是必不可少的一步
    /* 
        难点在于这i + 1  这个 + 1 的操作就是负责让下次的比较
        不用拿已经被选择出来的值来继续进行比较
        其次是已经 + 1 了  所以没有必要
    */
    for (let j = i + 1; j < arr.length; j++) {  // 只是负责找出最小值进行的循环 (很有必要)
      if (arr[j] < arr[minIndex]) {     // 寻找最小的数
        minIndex = j                // 将最小数的索引保存
      }
    }
    // 下面是正常的交换值    
    temp = arr[i]
    arr[i] = arr[minIndex]
    arr[minIndex] = temp
  }
  // 最后return 返回这个排序好了的数组
  return arr;
}
// 下面直接打印返回出来的值
console.log(selectionSort([123, 4123, 3421, 45523, 213, 21]))  // [ 21, 123, 213, 3421, 4123, 45523 ]

image.png

举个例子,一个数组为 56、12、80、91、29,其排序过程如下:

  • 第一次遍历时,从下标为 1 的位置即 56 开始,找出关键字值最小的记录 12,同下标为 0 的关键字 56 交换位置。此时数组为 12、56、80、91、20

  • 第二次遍历时,从下标为 2 的位置即 56 开始,找出最小值 20,同下标为 2 的关键字 56 互换位置,此时数组为12、20、80、91、56

  • 第三次遍历时,从下标为 3 的位置即 80 开始,找出最小值 56,同下标为 3 的关键字 80 互换位置,此时数组为 12、20、56、91、80

  • 第四次遍历时,从下标为 4 的位置即 91 开始,找出最小是 80,同下标为 4 的关键字 91 互换位置,此时排序完成,变成有序数组

应用场景:举一个栗子

你在网购的时候总能看见 按照价格排序 吧,然后还有漫画、动漫、电视剧、等一些有 升序降序 的地方都是需要进行排序的,当然 ES6 的新语法中有对数组进行排序的方法,但是你觉得他们的底层不是这些排序?

说也说完了,如果还有不懂的我建议写一个 html, js 写在script里面然后去浏览器里用调试工具来进行复看!