思路:选择排序的关键字是“最小值”:循环遍历数组,每次都找出当前范围内的最小值,把它放在当前范围的头部;然后缩小排序范围,继续重复以上操作,直至数组完全有序为止。

代码:

  1. function selectSort(arr) {
  2. // 缓存数组长度
  3. const len = arr.length
  4. // 定义 minIndex,缓存当前区间最小值的索引,注意是索引
  5. let minIndex
  6. // i 是当前排序区间的起点
  7. for(let i = 0; i < len - 1; i++) {
  8. // 初始化 minIndex 为当前区间第一个元素
  9. minIndex = i
  10. // i、j分别定义当前区间的上下界,i是左边界,j是右边界
  11. for(let j = i; j < len; j++) {
  12. // 若 j 处的数据项比当前最小值还要小,则更新最小值索引为 j
  13. if(arr[j] < arr[minIndex]) {
  14. minIndex = j
  15. }
  16. }
  17. // 如果 minIndex 对应元素不是目前的头部元素,则交换两者
  18. if(minIndex !== i) {
  19. [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
  20. }
  21. }
  22. return arr
  23. }

选择排序的时间复杂度

在时间复杂度这方面,选择排序没有那么多弯弯绕绕:最好情况也好,最坏情况也罢,两者之间的区别仅仅在于元素交换的次数不同,但都是要走内层循环作比较的。因此选择排序的三个时间复杂度都对应两层循环消耗的时间量级: O(n^2)。