我为合并排序创建了一个JavaScript插图。它运行完美,我想要的只是使它在给定的时间间隔内排序。为了在500ms的间隔显示数字排序,我需要在哪里放置setTimeout或setInterval函数?
numbers = [15, 20, 4, 1, 25, 45, 32, 4];
function doMergeSort() {
numbers = mergeSort(numbers);
}
function mergeSort(array) {
if (array.length < 2) {
return array;
}
let middle = parseInt(array.length/2);
let left = array.slice(0, middle);
let right = array.slice(middle, array.length);
return merge(mergeSort(left), mergeSort(right))
}
function merge(left, right) {
let result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length) {
result.push(left.shift());
}
while (right.length) {
result.push(right.shift());
}
return result;
}
要完整回答,我将需要查看如何处理绘制方法。请记住,他的应用程序主循环正在绘制中。这意味着它不会随着在绘制循环中调用方法而改变,而只会在绘制结束时为您提供所有结果,并以此来更新屏幕。
如果在draw方法中调用doMergeSort(),则将始终在绘制已排序的数组。
您将必须找到某种方法来分解合并排序算法,以便通过绘制通过循环来增加每个步骤。为了演示它,通常需要以一种单独的方式“破坏”该算法。
这是我正在谈论的概念的非常简单的示例:
请注意,circleB不会针对循环的UpdateCircleB()的每次迭代进行更新,仅在到达Draw()的末尾时才进行更新。
let circleA = {
y : 200,
x : 30,
r : 50
}
let circleB = {
y : 300,
x : 30,
r : 50
}
function setup() {
createCanvas(400, 800);
}
function draw() {
//Increment Purple circle using draw loop
//Every time we draw a frame, we move circle A 1 pixel to the right
circleA.x++;
//The green circle uses a for loop inside a method call to update
//Every time we draw a frame, we move circle B 50 pixels to the right
moveCircleB();
//draw purple circle
fill(152, 114, 132);
ellipse(circleA.x,circleA.y,circleA.r);
//draw green circle
fill(157, 191, 158);
ellipse(circleB.x,circleB.y,circleB.r);
}
function moveCircleB(){
for(var i = 0; i < 50; i++){
circleB.x++;
}
}
html, body {
margin: 0;
padding: 0;
}
canvas {
display: block;
}
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.10.2/p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.10.2/addons/p5.sound.min.js"></script>
<link rel="stylesheet" type="text/css" href="style.css">
<meta charset="utf-8" />
</head>
<body>
<script src="sketch.js"></script>
</body>
</html>