RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1202709
Accepted
solarisedigle
solarisedigle
Asked:2021-11-10 22:06:00 +0000 UTC2021-11-10 22:06:00 +0000 UTC 2021-11-10 22:06:00 +0000 UTC

Js错误超出最大调用堆栈大小

  • 772

我正在实现一种快速排序算法,但它仅在元素少于 +-3000 个时才有效。如果有更多元素 - 这个错误就会消失。有一个返回条件,一切正常。问题是什么以及如何解决?这是代码:

function getRandomIntInclusive(min, max) {
    tf = 0;
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
}
function getBaseLog(x, y) {
    return Math.log(y) / Math.log(x);
}
function check_sort(array){
    var flag = true;
    for (var i = 0; i < array.length - 1; i++) {
        if (array[i] > array[i + 1]) {
            flag = false;
        }
    }
    return flag;
}
function default_sort(array){
    var flag = true;
    while(flag){
        flag = false;
        for (var i = 0; i < array.length - 1; i++) {
            if (array[i] > array[i + 1]) {
                flag = true;
                var tmp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = tmp;
            }
        }
    }
    return array;
}
function bubblesort(array){
    var flag = true;
    var k = 0;
    var array_length = array.length;
    var steps = Math.floor(array_length/100);
    const time_start= new Date().getTime();
    while(flag){
        flag = false;
        for (var i = 0; i < array.length - 1; i++) {
            if (array[i] > array[i + 1]) {
                flag = true;
                var tmp = array[i];
                array[i] = array[i + 1];
                array[i + 1] = tmp;
            }
        }
        k++;
    }
    const time_end = new Date().getTime();
    var ms = time_end - time_start;
    console.log("Bubblesort - " + check_sort(array));
    return ms;
}
function selection(array){
    const time_start= new Date().getTime();
    var fixed = 0;
    var array_length = array.length;
    var steps = Math.floor(array_length/100);
    while (fixed < array.length - 1){
        var exchange = fixed;
        for (var i = fixed + 1; i < array.length; i++) {
            if(array[exchange] > array[i]){
                exchange = i; 
            }
        }
        if(exchange != fixed){
            var temp = array[fixed];
            array[fixed] = array[exchange];
            array[exchange] = temp;
        }
        fixed++;
    }
    const time_end = new Date().getTime();
    var ms = time_end - time_start;
    console.log("Selection - " + check_sort(array));
    return ms;
}
function shell(array){
    var step = array.length;
    const time_start= new Date().getTime();
    var array_length = array.length;
    var k = 0;
    while (step > 1){
        k++;
        step = Math.floor(step/2);
        for (var i = 0; i < step; i++) {
            var tmpray = [];
            for(var p = i; p <= array.length - 1; p += step){
                tmpray.push(array[p]);
            }
            tmpray = default_sort(tmpray);
            var j = 0;
            for(var p = i; p <= array.length - 1; p += step){
                array[p] = tmpray[j];
            j++;
            }
        }
    }
    const time_end = new Date().getTime();
    var ms = time_end - time_start;
    console.log("Shell - " + check_sort(array));
    return ms;
}
var mrg_steps;
var mrg_max;
var mrg_k;
function merge_recursive(array){
    mrg_k += 1;
    if(array.length > 1){
        var array_1 = array.slice(0, Math.floor((array.length)/2));
        var array_2 = array.slice(Math.floor((array.length)/2), array.length);
        array = default_sort(merge_recursive(array_1).concat(merge_recursive(array_2)));
    }
    return array;
}
function merge(array){
    mrg_max = array.length*2;
    mrg_steps = Math.floor(mrg_max/100);
    mrg_k = 1;
    const time_start= new Date().getTime();
    if(array.length > 1){
        var array_1 = array.slice(0, Math.floor((array.length)/2));
        var array_2 = array.slice(Math.floor((array.length)/2), array.length);
        array = default_sort(merge_recursive(array_1).concat(merge_recursive(array_2)));
    }
    const time_end = new Date().getTime();
    var ms = time_end - time_start;
    console.log("Merge - " + check_sort(array));
    return ms;
}
var k = 0;
function quicksort_recursive(start, end, array){
    k++;
    var i = start + 1;
    var j = end;
    var fixed = start;
    while(1){
        while(array[fixed] > array[i] && i < end){
            i++;
        }
        while(array[j] >= array[fixed] && j > start){
            j--;
        }
        if(i < j){
            var tmp = array[i];
            array[i] = array[j];
            array[j] = tmp;
        }
        else {
            var tmp = array[j];
            array[j] = array[fixed];
            array[fixed] = tmp;
            break;
        }
    }
    if(j > start) quicksort_recursive(start, j, array);
    if(i < end) quicksort_recursive(i, end, array);
    return;
}
function quicksort(array){
    const time_start= new Date().getTime();
    var start = 0;
    var end = array.length - 1;
    var i = start + 1;
    var j = end;
    var fixed = start;
    while(1){
        while(array[fixed] > array[i] && i < end){
            i++;
        }
        while(array[j] >= array[fixed] && j > start){
            j--;
        }
        if(i < j){
            var tmp = array[i];
            array[i] = array[j];
            array[j] = tmp;
        }
        else {
            var tmp = array[j];
            array[j] = array[fixed];
            array[fixed] = tmp;
            break;
        }
    }

    if(j > start) quicksort_recursive(start, j, array);
    if(i < end) quicksort_recursive(i, end, array);

    const time_end = new Date().getTime();
    var ms = time_end - time_start;
    console.log("Quick - " + check_sort(array));
    return ms;
}
var array = [];
for (var i = 0; i < 9000; i++) {
    array.push(getRandomIntInclusive(-200000, 200000));
}
console.log(bubblesort(array));
console.log(selection(array));
console.log(shell(array));
console.log(merge(array));
console.log(quicksort(array));

javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    vp_arth
    2021-11-10T23:52:00Z2021-11-10T23:52:00Z

    通常,由于选择第一个元素作为枢轴,您会陷入排序输入数组的最坏情况。

    结果,每个元素都会生成一个 fork,并且堆栈长度趋向于 task size = N。
    每个调用都会占用一些内存,因此,在我的浏览器中,堆栈以 depth = 6987 结束。

    • 4

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5