【问题标题】:selectionSort Javascript animationselectionSort Javascript 动画
【发布时间】:2021-07-30 12:13:21
【问题描述】:

我正在尝试在 javascript 中构建一些著名的排序算法的可视化表示,但我不明白为什么我的代码不会打印每次迭代,即使打印函数在 for 循环中。我只得到最终结果。

这是排序函数,特别是选择排序算法:

function selectionSort(array) {
var i, j, min_idx;
let n = array.length;

for (i = 0; i < n-1; i++)
{
    min_idx = i;
    for (j = i + 1; j < n; j++)
    {
        if (array[j] < array[min_idx])
        {
            min_idx = j;
        }
    }
    var temp = array[min_idx];
    array[min_idx] = array[i];
    array[i] = temp;
    printArray(array);
}

}

这是打印功能:

function printArray(array) {
document.getElementById('container').innerHTML ='';
for(let i = 0; i < array.length; i++)
{
    document.getElementById('container').innerHTML += '<div class = "column '+i+'" id = "'+i+'" style = "height: '+array[i]+'px;"></div>';
}

}

非常感谢

【问题讨论】:

  • 因为你document.getElementById('container').innerHTML ='';就在你输出之前
  • 每次调用“printArray”时都会清除 div。 document.getElementById('container').innerHTML ='';
  • 您也不太可能看到内容更改 - 因为在排序循环进行时浏览器不会执行任何渲染 - 您的里程可能会有所不同

标签: javascript arrays sorting animation


【解决方案1】:

这是@Bravo 在 cmets 中所说的。屏幕每秒至少更新 60 次,但排序所需的时间更少。所以你需要在递归循环中添加一个超时,这样你才能真正看到动画。

我用这个递归循环替换了第一个 for 循环。我认为代码不言自明。

我在您的printArray() 中进行了一些优化,需要时间来不断地进行 DOM 更改。相反,循环创建一个文本字符串,然后将其添加一次到#container.innerHTML。给可视化 div 的值也有一些错误的想法,你只添加了顺序 (i),而不是添加实际值 (array[i])。

const iterationLegend = document.getElementById('iterations');
const containerDiv    = document.getElementById('container');

const ANIMATION_SPEED = 1000;
const RESTART = 0;

var firstIteration;

function startSelectionSort(array) {
  firstIteration = RESTART;
  selectionSort(array);
}

function selectionSort(array) {
  let min_idx = firstIteration,
      n = array.length;
  
  for (let j = firstIteration + 1; j < n; j++) {
    if (array[j] < array[min_idx]) {
      min_idx = j;
    }
  }

  var temp = array[min_idx];
  array[min_idx] = array[firstIteration];
  array[firstIteration] = temp;

  visualizeArray(array);
  iterationLegend.textContent = 'iteration ' + firstIteration;
    
  if (firstIteration < n - 1) {
    firstIteration++;
    setTimeout(selectionSort.bind(this, array), ANIMATION_SPEED);
  } else {
    iterationLegend.textContent = 'Done';
  }
}

function visualizeArray(array) {
  let elementStr = '';
  let value = 0;

  for (let i = 0; i < array.length; i++) {
    value = array[i];
    elementStr += `<div class="column${value}" data-value="${value}"></div>`;
  }

  containerDiv.innerHTML = elementStr;
}

startSelectionSort([2, 3, 5, 5, 1, 1, 1, 1, 4]);
fieldset {
  display: inline;
}

#iterations {
  font-size: 13px;
  text-transform: uppercase;
}

#container {
  display: inline-flex;
}

#container > div {
  width: 10px;
  height: 100px;
  margin: 2px 1px 0px;
}

.column1 {
  background-color: brown;
}

.column2 {
  background-color: black;
}

.column3 {
  background-color: teal;
}

.column4 {
  background-color: red;
}

.column5 {
  background-color: indigo;
}
<fieldset>
 <legend id="iterations">Iterations</legend>
 <div id="container"></div>
</fieldset>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多