前置知识 —— 等差数列
等差数列,又名算术数列(英文:arithmetic sequence 或 arithmetic progression),是数列的一种。在等差数列中,任何相邻两项的差相等,该差值称为公差(common difference)维基百科
等差数列和: 一个等差数列的首 n 项之和,称为等差数列和(sum of arithmetic sequence)或算术级数(arithmetic series),记作 Sn。 举例来说,等差数列 {1, 3, 5, 7} 的和是 1 + 3 + 5 + 7 = 16。 等差数列求和的公式如下:
选择排序
选择排序: 从待排序的数据集中, 选择最小(或者最大)的一个元素, 然后与 起始位置 进行交换, 然后再从 剩余的数据集中继续选择,以此类推, 直到所有的元素都被排序过
数据结构: 数组
时间复杂度:
- 时间复杂度: 时间复杂度计算公式 假设有n的元素, 第一次 从n的元素中选择最小(最大)的元素, 第二次从n-1个元素中选择, 第三次n-2 ... 1, 操作数 根据等差数列公式:
在算法中中, 这样的常数可以省略, 因为当数据量很大的时候, 这些对于计算可以忽略不计,因此可以得到
空间复杂度:
因为是在原本的数组上进行操作, 所以无需额外的空间, 故空间复杂度为:
图解
假设存在一组无序数组: [8, 5, 2, 6, 9, 3, 1, 4, 0, 7]
代码实现(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]