相信大家对冒泡排序都不陌生吧,下面介绍下和冒泡排序有着相同时间复杂度的另一个算法“选择排序”(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)