排序算法之——选择排序

245 阅读1分钟

前置知识 —— 等差数列

等差数列,又名算术数列(英文:arithmetic sequence 或 arithmetic progression),是数列的一种。在等差数列中,任何相邻两项的差相等,该差值称为公差(common difference)维基百科

等差数列和: 一个等差数列的首 n 项之和,称为等差数列和(sum of arithmetic sequence)或算术级数(arithmetic series),记作 Sn。 举例来说,等差数列 {1, 3, 5, 7} 的和是 1 + 3 + 5 + 7 = 16。 等差数列求和的公式如下:

Sn=n2(a1+an)S_n = \frac{n}{2}(a_1 + a_n)

选择排序

选择排序: 从待排序的数据集中, 选择最小(或者最大)的一个元素, 然后与 起始位置 进行交换, 然后再从 剩余的数据集中继续选择,以此类推, 直到所有的元素都被排序过

数据结构: 数组

时间复杂度: O(n2)O(n^2)

  • 时间复杂度: O(n2)O(n^2) 时间复杂度计算公式 假设有n的元素, 第一次 从n的元素中选择最小(最大)的元素, 第二次从n-1个元素中选择, 第三次n-2 ... 1, 操作数 n+n1+n2....+1n + n - 1 + n - 2 .... + 1 根据等差数列公式:
(1+n)n2=n2+n22\frac{(1 + n)n}{2} = \frac{n}{2} + \frac{n^2}{2}

在算法中中, 12\frac{1}{2} 这样的常数可以省略, 因为当数据量很大的时候, 这些对于计算可以忽略不计,因此可以得到 O(n2)O(n^2)

空间复杂度: O(1)O(1)

因为是在原本的数组上进行操作, 所以无需额外的空间, 故空间复杂度为: O(1)O(1)

图解

假设存在一组无序数组: [8, 5, 2, 6, 9, 3, 1, 4, 0, 7] Selection-Sort-Animation.gif

代码实现(Typescript版本)

function selectionSort( arr: Array<Number> ):Array<Number> {
  if (arr.length <= 1) return arr
  for (let i = 0; i < arr.length - 1; i++) {
    let curIndex = i
    for (let j = i + 1; j < arr.length; j++) {
      arr[j] < arr[curIndex] && (curIndex = j)
    }
    /*
     * 等价于:
     * const temp = arr[i]
     * arr[i] =  arr[curIndex]
     * arr[curIndex] = temp
     */
    [ arr[curIndex], arr[i] ] = [ arr[i], arr[curIndex] ]
  }
  return arr;
}
const arr:Array<Number> = [8, 5, 2, 6, 9, 3, 1, 4, 0, 7]

const result = selectionSort(arr)
console.log(result) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]