сделать страницу для визуализации быстрой сортировки? - PullRequest
1 голос
/ 03 марта 2020

Я хотел бы показать визуально быструю сортировку, используя вертикальные столбцы различной высоты, где высота столбцов продолжает изменяться в зависимости от алгоритма.

Если я использую функцию быстрой сортировки без setInterval, где сортируются только последние результат отображается, он работает правильно. Версия выглядит следующим образом.

function f(e) {
  initializeBlock()
  quicksort(0, n-1)
}

function quicksort(p, r){
  if (p < r){
    pivot = bars[r].offsetHeight
    var i = p - 1
    var j = p
    for (j = p; j < r; j++){
      if (bars[j].offsetHeight <= pivot) {
        i++
        temp = bars[i].offsetHeight
        bars[i].style.height = bars[j].offsetHeight + "px"
        bars[j].style.height = temp + "px"
      }
    }
    i++
    temp = bars[i].offsetHeight
    bars[i].style.height = bars[r].offsetHeight + "px"
    bars[r].style.height = temp + "px"
    quicksort(p, i-1)
    quicksort(i+1, r)
  }
}

вызов функции должен выглядеть следующим образом:

goBtn.addEventListener('click', f)

Принимая во внимание, что если setInterval с функцией быстрой сортировки используется для фактического отображения происходящей быстрой сортировки, отображается результат неверно, т.е. высота столбцов отсортирована только частично. Версия следующая.

function g(e){
  initializeBlock()
  quicksortWithInterval(0, n-1)
}

function quicksortWithInterval(p, r){
  if (p < r){
    pivot = bars[r].offsetHeight
    var i = p - 1
    var j = p
    var iId = setInterval(
      function() {
        if (bars[j].offsetHeight <= pivot) {
          i++
          temp = bars[i].offsetHeight
          bars[i].style.height = bars[j].offsetHeight + "px"
          bars[j].style.height = temp + "px"
        }
        if (++j == r) {
          clearInterval(iId)
          i++
          temp = bars[i].offsetHeight
          bars[i].style.height = bars[r].offsetHeight + "px"
          bars[r].style.height = temp + "px"
          quicksortWithInterval(p, i-1)
          quicksortWithInterval(i+1, r)
        }
    }, 1)
  }
}

вызов функции должен выглядеть следующим образом:

goBtn.addEventListener('click', f)

Я не совсем уверен, почему это происходит потому, что рекурсивный вызов быстрой сортировки выполняется на независимых наборах? Пожалуйста, помогите прояснить проблему здесь.

...