我写出来的splice比slice快

来源:3-14 -用JS实现快速排序并说明时间复杂度-性能分析

袁门弟子

2023-03-01

http://img.mukewang.com/szimg/63ff41e409cea28018171282.jpg

如上,我是按照教程写的,不知道为啥用的同样的测试arr,slice要比splice慢上千倍,slice到了秒级别了

下面是我的代码

/**

* 通过找到中间值,然后将小于当前中间值的放到left数组,大于放right数组

* 然后递归调用,对每一个left和right再次进行排序

* 利用中间值分割的方式来进行递归调用

*/

function mp(arr: number[]): number[] {

if(arr.length < 1) return [];

const middleId = Math.floor(arr.length / 2) //  中间值的下标

const middleVal = arr.splice(middleId, 1)[0] //  截取中间值,并返回

const left: number[] = [];

const right: number[] = [];

for(let i = 0; i < arr.length; i++) { //  需要注意:此时arr中已经没有middle了

const cur = arr[i]

if(cur < middleVal) {

left.push(cur)

} else if(cur >= middleVal) {

right.push(cur)

}

}

return mp(left).concat(middleVal, mp(right))

}


// const arr = [4, 2, 4, 1, 3, 5, 3, 10, 8, 9, 5]

const arr = [2, 5, 3, 1, 9, 4, 12, 11, 55, 0]


console.info(mp(arr))

console.time()

for(let i = 0; i < 100 * 10000; i++) {

mp(arr)

}

console.timeEnd()

==========================================================

/**

* 通过找到中间值,然后将小于当前中间值的放到left数组,大于放right数组

* 然后递归调用,对每一个left和right再次进行排序

* 利用中间值分割的方式来进行递归调用

*/

function mpSlice(arr: number[]): number[] {

if(arr.length < 1) return [];

const middleId = Math.floor(arr.length / 2) //  中间值的下标

const middleVal = arr.slice(middleId, middleId + 1)[0] //  截取中间值,并返回

const left: number[] = [];

const right: number[] = [];

for(let i = 0; i < arr.length; i++) { //  需要注意:此时arr中已经没有middle了

const cur = arr[i]

if(cur < middleVal) {

left.push(cur)

} else if(cur > middleVal) {

right.push(cur)

}

}

return mpSlice(left).concat(middleVal, mpSlice(right))

}


// const arr1 = [4, 2, 4, 1, 3, 5, 3, 10, 8, 9, 5]

const arr1 = [2, 5, 3, 1, 9, 4, 12, 11, 55, 0]

console.info(mpSlice(arr1))

console.time()

for(let i = 0; i < 100 * 10000; i++) {

mpSlice(arr1)

}

console.timeEnd()


写回答

1回答

双越

2023-03-02

你不要循环 100* 10000 编,而是把要排序的数组变成一个 100*10000 长度的数组,再试试。

0
2
双越
回复
袁门弟子
效果很明显
2023-03-02
共2条回复

2周刷完100道前端优质面试真题 双越最新力作

『前端面试真题100道』视频详解

1509 学习 · 642 问题

查看课程