请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

我写出来的splice比slice快

https://img1.sycdn.imooc.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()


正在回答 回答被采纳积分+3

1回答

双越 2023-03-02 08:08:26

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

0 回复 有任何疑惑可以回复我~
  • 提问者 袁门弟子 #1
    我用了
    const arr: number[] = []
    for(let i = 0; i < 100 * 10000; i++) {
      const j = Math.floor(Math.random() * 1000)
      arr.push(j)
    }
    这样去添加arr数组
    现在splice用了7.4秒
    slice151毫秒~
    晕了
    回复 有任何疑惑可以回复我~ 2023-03-02 12:36:53
  • 双越 回复 提问者 袁门弟子 #2
    效果很明显
    回复 有任何疑惑可以回复我~ 2023-03-02 13:28:33
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号