今天本来学习快排的算法,看到网上的算法,对比自己的方式,自己的竟然发生了栈溢出,然后找了一些方法也没有奏效。
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
刚开始不会无限循环,最后运行到left = [22,11],midKey = 11时,left会成为空数组,这个时候会循环递归这个函数,传入的是空数组。
但我还是不是很理解