Skip to content

选择排序 #65

Open
Open
@myLightLin

Description

@myLightLin

简介

排序算法 时间复杂度 是否基于比较
冒泡、插入、选择 O(n²)
快排、归并 O(nlogn)
桶、计数、基数 O(n) ×

选择排序,将数据分为已排序和未排序区间,然后每次从未排序区间选择一个最小的数,将其放到已排序区间末尾,重复这个过程,直到未排序区间为空。

代码

function selectionSort(arr) {
  const n = arr.length
  if (n <= 1) return
  let minIdex
  
  for (let i = 0; i < n-1; i++) {
    minIndex = i
    for (let j = i+1; j < n; j++) {
      if (arr[j] < arr[minIndex]) {
        minIndex = j
      }
    }
    swap(arr, minIndex, i)
  }
}

function swap(arr, i, j) {
  const temp = arr[i]
  arr[i] = arr[j]
  arr[j] = temp
}

const arr = [64, 25, 12, 22, 11]
selectionSort(arr) // [11, 12, 22, 25, 64]

动画演示

Selection-Sort-Animation

总结

  1. 最好,最坏,平均时间复杂度都是 O(n²),空间复杂度是 O(1)
  2. 是一个不稳定的排序算法,因为每次都要从未排序区间里选取最小的数,去跟前面的数交换,这样就破坏了稳定性。

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions