炫意html5
最早CSS3和HTML5移动技术网站之一

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

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

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却不会,暂时也没想通是为什么。

回答

那必须溢出啊,

你要清楚的认识splice(),

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

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

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

 

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

Java基础教程Android基础教程