function bubleSort(arr) { for(let i = 0; i < arr.length; i++) { for(let j = 0; j < arr.length - i; j++) { if(arr[j] > arr[j+1]) { [ arr[j], arr[j+1] ] = [ arr[j+1], arr[j] ] } } } } let arr = [10, 34, 21, 47, 3, 28] bubleSort(arr) console.log(arr)
下面我们测试排序性能。以下的代码中,randomArr 函数会生成一个随机数组, 数组长度默认是100, 最大值默认值是1000。 console.time 和 console.end 用来记录排序时间。
let arr = randomArr(10000, 100) console.time('bubleSort') bubleSort(arr) console.timeEnd('bubleSort') function randomArr( arrLen = 100, maxValue = 1000 ) { let arr = [] for(let i = 0; i < arrLen; i++) { arr[i] = Math.floor((maxValue+1)*Math.random()) } return arr } function bubleSort(arr) { for(let i = 0; i < arr.length; i++) { for(let j = 0; j < arr.length - i; j++) { if(arr[j] > arr[j+1]) { [ arr[j], arr[j+1] ] = [ arr[j+1], arr[j] ] /*交换元素*/ } } } }
经浏览器测试,数组长度增加10倍,排序时间约增加100倍。
时间复杂度(可以理解为排序的次数)计算: (n-1) + (n-2) + ... + 1 = n*(1 + (n-1))/2,所以时间复杂度为 O(n^2) ,和上面的测试基本一致。