算法入门---选择排序

相信大家对冒泡排序都不陌生吧,下面介绍下和冒泡排序有着相同时间复杂度的另一个算法“选择排序”(O(n^2))

//先定义一个找最小数字的函数
//函数用一个smallest的中间变量储存最小值,然后逐项比较
//得出的最小值最后和arr[0]互换数值
function findSmallest (arr) {
    let smallest = arr[0]
    let smallestIndex = 0
    arr.forEach((item, index) => {
        if(item < smallest) {
            smallest = item
            smallIndex = index
        }
    })
    let temp = arr[0]
    arr[0] = smallest
    arr[smallIndex] = temp
    return smallest
}
//循环n次,每次往新数组存入最小值,同时把原数组放在头部的最小值去除以减少findSmallest的对比次数
function sort(arr) {
    let newArr = []
    let len = arr.length
    for(let i = 0;i < len; i++) {
        newArr.push(findSmallest(arr))
        arr.shift()
    }
    return newArr
}

相信有不少童鞋有一个疑问,为什么时间复杂度是O(n^2),明明是n-1、n-2、n-3、......3、2、1的总和既是(n-1)*[(n-1)+1]/2 = (n^2-n)/2

但是对于大O表示法来说,所有n最高次以外的都是忽略不计的

时间复杂度不是O((n^2-n)/2),而是O(n^2)

原文地址:https://www.cnblogs.com/amiezhang/p/8516743.html