我写出来的splice比slice快
来源:3-14 -用JS实现快速排序并说明时间复杂度-性能分析
袁门弟子
2023-03-01
如上,我是按照教程写的,不知道为啥用的同样的测试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 长度的数组,再试试。
022023-03-02
相似问题