首页 新闻 搜索 专区 学院

js写快排时遇到的调用栈一出问题,Uncaught RangeError: Maximum call stack size exceeded

0
悬赏园豆:20 [已解决问题] 解决于 2021-11-19 13:35

今天本来学习快排的算法,看到网上的算法,对比自己的方式,自己的竟然发生了栈溢出,然后找了一些方法也没有奏效。

arr = [33,77,88,44,55,11,66,99,22,44]
var quickSort = function(arrTemp) {
if(arrTemp.length < 2) {
return arrTemp;
}
var middle = Math.floor(arrTemp.length / 2);
var midKey = arrTemp[middle];//方式1
// var midKey = arrTemp.splice(middle, 1)[0];//方式2
var left = [];
var right = [];
for(var i = 0 ; i < arrTemp.length; i ++) {
if(arrTemp[i] < midKey) {
left.push(arrTemp[i]);
}else {
right.push(arrTemp[i]);
}
}
return quickSort(left).concat([midKey],quickSort(right))
}

console.log(quickSort(arr));

使用方式1时会产生栈溢出,但是使用方式2却不会,暂时也没想通是为什么。

小白兔有点裤的主页 小白兔有点裤 | 初学一级 | 园豆:155
提问于:2021-11-18 22:26
< >
分享
最佳答案
0

那必须溢出啊,

你要清楚的认识splice(),

方式2是获取的同时,移除当前数组元素;

方式1是只获取,不对数组做任何操作操作。

如果用方式1,然后运行到下面,arrTemp[i] < midKey的判断永远不满足,导致left永远是空([])数组,然后调用上面quickSort 递归时候就是无限循环去了,一直递归调用自己,无法停止,只有在内存被塞满(内存溢出)的时候,报错才能够停止。然后你就看到 Uncaught RangeError: Maximum call stack size exceeded

 

收获园豆:20
熊泽-学习中的苦与乐 | 老鸟四级 |园豆:2067 | 2021-11-19 09:34

刚开始不会无限循环,最后运行到left = [22,11],midKey = 11时,left会成为空数组,这个时候会循环递归这个函数,传入的是空数组。

小白兔有点裤 | 园豆:155 (初学一级) | 2021-11-19 14:48

但我还是不是很理解

小白兔有点裤 | 园豆:155 (初学一级) | 2021-11-19 14:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册