| 中文名称 | 英文名称 | 平均时间复杂度 | 最坏时间复杂度 | 最好时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|---|---|
| 选择排序 | Selection | n² | n² | n² | 1 | 不稳 |
| 冒泡排序 | Bubble | n² | n² | n | 1 | 稳 |
| 插入排序 | Insertion | n² | n² | n | 1 | 稳 |
| 堆排序 | heap | 1 | 不稳 | |||
| 希尔排序 | Shell | n² | n | 1 | 不稳 | |
| 归并排序 | Merge | n | 稳 | |||
| 快速排序 | Quick | n² | 不稳 | |||
| 桶排序 | Bucket | n+k | n² | n | n+k | 稳 |
| 计数排序 | Counting | n+k | n+k | n+k | n+k | 稳 |
| 基数排序 | Radix | n×k | n×k | n×k | n+k | 稳 |
选泡插,
快归堆希统计基,
恩方恩老恩一三,
对恩加K恩乘k,
不稳稳稳不稳稳,
不稳不稳稳稳稳。
选择排序
一种最简单,也是最没用的排序算法(马士兵老师说的),时间复杂度高而且不稳定,但是也有一定的优化空间。
排序思想:
不断遍历数组,每次都找到最小的那个数放到最前面,直到所有的数都是有序的。
如何验证你的算法是否正确?
- 肉眼观察
- 产生足够多随机样本
- 用确定正确的算法计算样本结果
- 对比被验证算法的结果
代码实现:
// 排序类
class Order {
constructor(){
}
// 选择排序
Selection(arr){
for (let i = 0, len = arr.length; i < len; i++) {
let minIndex = i
for (let j = i + 1; j < len; j++) {
if(arr[j] < arr[minIndex]){
minIndex = j
}
}
this.swap(arr,i,minIndex)
}
return arr
}
// 交换数组两个下标的值
swap(arr,index1,index2){
let temp = arr[index1]
arr[index1] = arr[index2]
arr[index2] = temp
}
// 产生随机样本
generateRandomArray(){
let arr = []
for (let i = 0; i < 10000; i++) {
arr.push(parseInt(Math.random() * 10000))
}
return arr
}
// 证明正确
check(name){
console.log('检查中...')
for (let i = 1; i <= 100; i++) {
console.log(`第${i}次验证样本`)
let arr1 = this.generateRandomArray()
let arr2 = [...arr1]
arr1.sort((a,b)=>a-b)
// 验证算法
this[name](arr2)
// 判断结果
if(arr1.some((item,index)=>item!=arr2[index])){
console.log('算法错误!')
return false
}
console.log(`第${i}次验证样本成功`)
}
console.log('算法正确!')
return true
}
}
let selection = new Order()
selection.check('Selection')