学习经典排序算法-选择排序(selectionSort)

232 阅读2分钟

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

上一篇文章学习了排序方法, 另更多更文学习 JavaScript 的系列小总结更多阅读-list & 经典排序算法-list

本文来继续学习经典排序方法: 选择排序 (selectionSort)

JS 实现排序算法-选择排序 selectionSort

选择排序(selectionSort) 是一种简单直观的排序算法.

无论什么数据进去, 时间复杂度都是 O(n²): 假设被排序的数列中有 N个数。遍历一趟的时间复杂度是O(N),因需要遍历 N-1次 . 因此,选择排序的时间复杂度是 [O(n²)]

所以选择"选择排序", 则数据规模越越好, 唯一的好处可能就是不占用额外的内存空间

选择排序 算法步骤

每一次循环都是对剩余元素进行循环-操作排序

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。

选择排序 JS 代码实现:

  1. 选择排序 selectionSort 函数实现
function selectionSort(arr) {
  let len = arr.length
  let minIndex, temp // 记录最小值的下标 及中间缓存用值
  for (var i = 0; i < len - 1; i++) {
    minIndex = i
    for (var j = i + 1; j < len; j++) {
      if (arr[j] < arr[minIndex]) {
        // 寻找最小的数
        minIndex = j // 将最小数的索引保存
      }
    }
    temp = arr[i]
    arr[i] = arr[minIndex]
    arr[minIndex] = temp
  }
  return arr
}
// 引入下面的 test代码耗时的方法: 进行测试排序对处理100+条数据的排序耗时:
getFnRunTime(selectionSort)

测试代码运行耗时的方法

这里 由于选择排序 会一遍一遍地遍历剩余数据(基数大则很慢) 比较适合数据量较小的数据进行排序, 故 20w+ 的数据并不太适合..

const testArrFn = function (len) {
  let arr = []
  const count = len
  for (let i = 0; i < count; i++) {
    arr[i] = Math.floor(Math.random() * 50 + 1)
  }
  return arr
}
let testArr = testArrFn(len)

let len = testArr.length
/**
 * @desc 测试函数执行的时间
 */
module.exports = async function getFnRunTime(fn) {
  let startTime = Date.now(),
    endTime
  let result = await fn(testArr)
  endTime = Date.now()
  console.log(testArr, result)
  console.log(`total time: ${endTime - startTime}ms, `, "test array'length: " + len, result.length)
}

更多阅读

经典排序算法: