用JavaScript实现选择排序

348 阅读1分钟

一、简介:

  • 时间复杂度: O(n²)
  • 空间复杂度: O(1)
  • 稳定性:不稳定
  • 优点:空间复杂度低,占用内存较少
  • 缺点: 时间复杂度太高,执行效率差,且不稳定

二、核心思想

  • 关注点应该在未排序部分
  • 未排序中找到最小值放到已经排好序的末尾
  • 两层循环,每层循环的作用是啥? 这里调皮下,代码里有注释,自己看!!!

三、排序过程的动图

红色:未排序中最小值 (会变,开始是假设值,后面变成真正的最小值)
绿色:与假设值对比的值
黄素:已排序部分
蓝色:未排序部分

选择排序.gif

四、代码实现

代码地址:github.com/shubenwumin…
我会把注释写的详细点。大家结合我的注释和动图及核心思想,一定可以很快弄懂的。

通用交换位置的函数:

const changePos = function (arr, index1, index2) {
  arr[index1] = arr.splice(index2, 1, arr[index1])[0];
}

具体代码:

const selectSort = function (arr) {
  let length = arr.length;
  let minIndex;
  // 该循环作用:将未排序部分中确立的最小值,放到排序好的末尾
  for (let i = 0; i < length -1; i++) {
    // 假设未排序部分最小值为未排序部分的第一个元素即i;
    minIndex = i;
    // 该循环作用:与假设的最小值对比,确立真正的最小值的下标
    for (let j = i + 1; j < length; j++) {
      if(arr[j] < arr[minIndex]) {
        minIndex = j;
      }
    }
    // 关键步骤来了,讲得到的最小值放到未排序部分的首位 或者 理解成放到排好序部分的末尾;
    changePos(arr, i, minIndex);
  }
  return arr;
}