javascript - 在Js中使用for循环进行快速排序
问题描述
我正在编写快速排序算法,当我测试我的代码时,结果让我感到困惑。
RangeError:Array.push () 处超出了最大调用堆栈大小
let arr = [0,-1,1,0,1,-1,100,23,17,56,39,47,23,-34,-56];
export default function quickSort(array){
let len = array.length;
if(len <= 1) return array;
let piviot = array.pop();
let left = [], right = [];
for (let i = 0; i < len; i++) {
if(array[i] < piviot){
left.push(array[i]);
}
else{
right.push(array[i])
}
}
return quickSort(left).concat(piviot,quickSort(right));
}
当我将 for 循环更改为 forEach 时,问题消失了,但我不知道为什么。
export default function quickSort(array){
let len = array.length;
if(len <= 1) return array;
let piviot = array.pop();
let left = [], right = [];
array.forEach(item => {
if(item < piviot){
left.push(item)
}
else{
right.push(item);
}
});
return quickSort(left).concat(piviot,quickSort(right));
}
谢谢。
解决方案
这将在piviot = array.pop();
更改导致问题的数组大小时起作用
export default function quickSort(array){
let len = array.length;
if(len <= 1) return array;
let piviot = array.pop();
len = array.length;
let left = [], right = [];
for (let i = 0; i < len; i++) {
if(array[i] < piviot){
left.push(array[i]);
}
else{
right.push(array[i])
}
}
return quickSort(left).concat(piviot,quickSort(right));
}
推荐阅读
- c++ - 从 libuv 句柄继承
- python - 如何从存储的 webelement 变量中检索 xpath?
- html - 如何在 HTML 画布标签中打开链接?
- python - 如何使用 Selenium 和 Python 从下拉菜单中选择项目?
- powershell - 在 PowerShell 中喜欢蓝色消息框?
- c# - 如何将后面的剃刀代码中的对象列表绑定到cshtml中的剑道图表
- vba - 无法点击(VBA + selenium+Chrome)/ FindelementbyId
- c# - 在剃须刀页面中使用 c# 从另一个列表框中填充选择选项
- python - python 生成 netaddr.core.NotRegisteredError 无效语法异常
- android - 应用退出后停止显示插页式广告?