如何在合并排序期间“暂停”以可视化 JS p5js

2024-01-04

我正在使用 p5.js 开发排序可视化工具,我需要知道是否可以减慢合并排序,以便可以更慢地绘制它。我目前正在尝试使用下面的睡眠功能来减慢它们的合并功能,但我得到

未捕获的类型错误:a.slice 不是函数。

我只是犯了一个愚蠢的错误,还是我错误地处理了这个问题?

let rectWidth;
let depth = 0;

function setup() {
    let numOfRects = document.getElementById('numOfRects').value;
    let width = document.getElementById('canvas').offsetWidth;
    let height = document.getElementById('canvas').offsetHeight;
    let canvas = createCanvas(width, height);

    rectWidth = floor(width / numOfRects);

    canvas.parent('canvas');
    values = new Array(floor(width / rectWidth));

    for (let i = 0; i < values.length; i++) {
        values[i] = random(height);
    }

    frameRate(1);
}

function draw() {
    background(23);
    values = mergeSort(values, depth);
    depth++;
    for (let i = 0; i < values.length; i++) {
        stroke(0);
        fill(255);
        rect(i * rectWidth, height - values[i], rectWidth, values[i]);
    }

}


function mergeSort(a, d) {
    if (a.length <= 1) {
        return a;
    }

    d--;
    if (d < 1) {
        return (a);
    }
    var mid = Math.round((a.length / 2));
    var left = a.slice(0, mid);
    var right = a.slice(mid);

    let leArr = mergeSort(left, d);
    let riArr = mergeSort(right, d);
    return merge(leArr, riArr);
}

async function merge(left, right) {
    sorted = [];
    while (left && left.length > 0 && right && right.length > 0) {
        if (left[0] <= right[0]) {
            sorted.push(left.shift());
        } else {
            sorted.push(right.shift());
        }
    }

    await sleep(50);

    return sorted.concat(left, right);
}

async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

合并算法中的睡眠根本没有意义。您的绘制函数只能绘制由返回的最终数组mergeSort。因此,即使你让算法变慢,你也不会看到任何中间结果,直到mergeSort尚未完成指定深度。

一种可能性是做归并排序 https://en.wikipedia.org/wiki/Merge_sort在一个单独的线程中并可视化draw数组的当前状态。但在这种情况下,您必须对“原始”数组应用排序,而不是创建数组的副本(通过slice)并在最后将它们写回原始数组。

参见示例:

let values = [];
let startSort = true;

function mergeSort(a) {
    // create copy of the array 
    copy = a.slice()
    // asynchronous sort the copy
    mergeSortSlice(copy, 0, copy.length);
    return;
}

async function mergeSortSlice(a, start, end) {
    if (end-start <= 1)
        return;
    
    var mid = Math.round((end+start) / 2);

    // wait till divides are sort 
    await mergeSortSlice(a, start, mid);
    await mergeSortSlice(a, mid, end);

     // merge divides
    let i = start, j = mid;
    while (i < end && j < end) {
        if (a[i] > a[j]) {
            let t = a[j]; a.splice(j, 1); a.splice(i, 0, t);
            j ++;
        }
        i ++;
        if (i==j) j ++;

        // copy back the current state of the sorting
        values = a.slice();
        
        // slow down
        await sleep(100);
    }

    // restart
    if (start == 0 && end == a.length) {
        await sleep(2000);
        startSort = true;
    }
}

async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

function setup() { 
    createCanvas(600, 190);
    frameRate(60);
}

let numOfRects = 15;
let rectWidth;
function draw() {
    if (startSort) {
        startSort = false;
        
        rectWidth = floor(width / numOfRects);
        values = new Array(floor(width / rectWidth));
        for (let i = 0; i < values.length; i++) {
            values[i] = random(height);
        }

        mergeSort(values);
    }

    background(23);
    stroke(0);
    fill(255);
    for (let i = 0; i < values.length; i++) {
        rect(i * rectWidth, height - values[i], rectWidth, values[i]);
    }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在合并排序期间“暂停”以可视化 JS p5js 的相关文章

随机推荐

  • 如何将普通锚链接与react-router一起使用

    非常类似于这个有角度的问题 https stackoverflow com questions 14712223 how to handle anchor hash linking in angularjs 使用react router时如
  • 从 Java\httpclient 3\linux 连接到 NTLMv2

    我正在使用 MAC 和 LINUX java6 和 apache http client 3 1 通过 NTLM 身份验证连接到共享点 我使用连接到ntlmhttp jcifs samba org http jcifs samba org
  • 使用 SQLAlchemy(MySQL) 和 Flask 时 MySQL 连接不可用

    我有时会收到此错误 有时正常 有时错误 sqlalchemy exc OperationalError OperationalError MySQL Connection not available 使用时session query 我正在
  • 如何有效地查找 Coq 中定义标识符的位置?

    在大多数 IDE 或文本编辑器中 您可以右键单击某个术语 它会将您带到定义该术语的文件 CoqIDE好像没有这个 所以我一直在做coqdoc myfile v html 然后转到生成的 HTML 文档 但该文件中唯一可点击的术语是针对 Co
  • 在 ANDROID 中以编程方式设置子布局宽度?

    在我的代码中 我有一个具有多个子布局的 XML 文件 我只想根据设备的屏幕宽度以编程方式设置这些子布局之一的宽度 到目前为止 我已经尝试过 Layout params setparam 和其他方法 但它在获取布局 id 时显示空指针异常 我
  • 将 DataContext 设置为 XAML 中的当前代码隐藏对象

    我试图将 UserControl 的 DataContext 设置为 UserControl 的代码隐藏类 从代码隐藏方面来说这真的很容易做到 public partial class OHMDataPage UserControl pub
  • OnDragListener 未收到 DRAG_STARTED 或 DRAG_ENDED,但收到 ACTION_DROP

    我遇到了一个奇怪的问题OnDragListener 我的目标视图得到ACTION DROP事件正常并处理它 但它从未收到ACTION DRAG STARTED or ACTION DRAG ENDEDevents 事实上 除了 drop 之
  • SSL 证书问题 - 根据验证程序,远程证书无效

    当尝试通过 C 桌面应用程序将文件上传到我的服务器时 我收到以下错误 根据验证过程 远程证书无效 这和SSL证书有关系 这是我的网站 由 Arvixe 托管 这是我使用的代码 public void Upload string strFil
  • Delphi TWebBrowser 内存泄漏

    我的应用程序使用加载网页的 TWebBrowser 问题是 关闭包含TWebBrowser的表单后 所使用的内存没有被释放 如果我打开并关闭表单 内存就会不断增加 看到一些关于调用 SetProcessWorkingSetSize 或 Co
  • tcp 校验和和 tcp 卸载

    我正在使用原始套接字来创建我自己的套接字 我需要设置 tcp checksum 我尝试了很多参考资料 但都不起作用 我正在使用wireshark进行测试 请问你能帮帮我吗 顺便说一句 我在某处读到如果你设置 tcp checksum 0 然
  • C++ istream 运算符>> 不良数据处理

    每次我在这里问一个问题时 结果都是一些非常愚蠢的错误 如果你不相信我 请检查我的历史 所以如果可以的话请耐心等待 感觉我的问题应该很受欢迎 但我找不到任何相关信息 而且我已经没有想法可以尝试了 无论如何 事不宜迟 我正在尝试超载输入oper
  • 当“允许不太安全的应用程序:关闭”时,如何将 java 中的邮件发送到 Gmail

    我能够在 java 中将邮件发送到 gmail 当 Allow less secure apps ON 你可以找到代码here http www javatpoint com example of sending email using j
  • 使用情节提要在 Xcode 6.1.1 中展开 Segue

    我一直在读到 unwind segue 在 Xcode 6 中存在 bug 我正在使用 Xcode 6 1 1 并且使用 swift 我使用导航控制器放置的 后退 按钮 因此我无法拖动到退出图标 此外 我也无法从 viewControlle
  • 来自加德纳的拼图

    我试图在 Prolog 中解决以下难题 编号为 0 9 的 10 个单元格刻有一个 10 位数字 每个单元格 例如 i 表示数字 i 在该数字中出现的总数 找到这个号码 答案是6210001000 这是我在 Prolog 中写的 但我被卡住
  • 在画布上挥动文字

    我怎样才能在画布元素上制作类似于上找到的文本this http www pageplugins com generators crazy text textwave php page EDIT Ben 忘记对你的问题无缘无故的反对票 并且
  • UWP - 在 NavigationViewItems 上设置 IsEnabled

    我有一个 UWP 应用程序NavigationView控制 导航项是通过设置创建的MenuItemsSource在 XAML 中转换为类型的对象集合NavigationViewElement
  • 将带有 VBA 宏的 Excel 图表复制并粘贴到 Word 中

    我知道我的问题可能听起来 微不足道 但我在任何地方都找不到解决方案 而且我已经筋疲力尽了 我正在编写一个宏来自动在 Word 中生成报告 在某个阶段 我需要插入一些图表 该图表位于 Excel 的图表工作表中 但没办法 这是我的代码 Sub
  • 如何使用 FTP 命令移动文件

    源文件的路径是 public html upload 64 SomeMusic mp3 我想将它移动到这条路径 public html archive 2011 05 64 SomeMusic mp3 我如何使用 FTP 命令执行此操作 在
  • WPF:选择时为文本框添加标签

    我想创建一个看起来像视觉工作室的简单设计器 具体来说 我希望我的项目具有与 VS 中相同的行为 当未选择它们时 会显示一个简单的标签 文本块 当它们被选择时 一个文本框可以让我编辑值 实现这一目标的最佳方法是什么 谢谢 为 TextBox
  • 如何在合并排序期间“暂停”以可视化 JS p5js

    我正在使用 p5 js 开发排序可视化工具 我需要知道是否可以减慢合并排序 以便可以更慢地绘制它 我目前正在尝试使用下面的睡眠功能来减慢它们的合并功能 但我得到 未捕获的类型错误 a slice 不是函数 我只是犯了一个愚蠢的错误 还是我错