Я хотел бы показать визуально быструю сортировку, используя вертикальные столбцы различной высоты, где высота столбцов продолжает изменяться в зависимости от алгоритма.
Если я использую функцию быстрой сортировки без 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)
Я не совсем уверен, почему это происходит потому, что рекурсивный вызов быстрой сортировки выполняется на независимых наборах? Пожалуйста, помогите прояснить проблему здесь.