每天学点算法-第一天

191 阅读2分钟
中文名称英文名称平均时间复杂度最坏时间复杂度最好时间复杂度空间复杂度稳定性
选择排序Selection1不稳
冒泡排序Bubblen1
插入排序Insertionn1
堆排序heapnlog2nnlog₂nnlog2nnlog₂nnlog2nnlog₂n1不稳
希尔排序Shelln13n¹·³n1不稳
归并排序Mergenlog2nnlog₂nnlog2nnlog₂nnlog2nnlog₂nn
快速排序Quicknlog2nnlog₂nnlog2nnlog₂nlog2nlog₂n不稳
桶排序Bucketn+knn+k
计数排序Countingn+kn+kn+kn+k
基数排序Radixn×kn×kn×kn+k
选泡插,
快归堆希统计基,
恩方恩老恩一三,
对恩加K恩乘k,
不稳稳稳不稳稳,
不稳不稳稳稳稳。

选择排序

一种最简单,也是最没用的排序算法(马士兵老师说的),时间复杂度高而且不稳定,但是也有一定的优化空间。

排序思想:

不断遍历数组,每次都找到最小的那个数放到最前面,直到所有的数都是有序的。

src=http___xyzip-1253271981.costj.myqcloud.com_%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%B9%B3%E5%8F%B0%E5%9B%BE%E5%BA%8A_Sort_SimpleSelectSort.gif&refer=http___xyzip-1253271981.costj.myqcloud.gif

如何验证你的算法是否正确?

  1. 肉眼观察
  2. 产生足够多随机样本
  3. 用确定正确的算法计算样本结果
  4. 对比被验证算法的结果

代码实现:

// 排序类
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')