После того, как я уже реализовал сортировку по пузырькам, вставкам и выделению, я сейчас застрял в сортировке слиянием. Цель состоит в том, чтобы визуализировать процесс сортировки слиянием, похожий на анимацию, отображаемую здесь https://www.youtube.com/watch?v=ZRPoEKHXTJg .

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

Здесь я уже застрял с сохранением состояния каждого подмассива, который должен отображаться один за другим с некоторой задержкой между ними (т.е. начиная с [1, 5, 4, 3, 6] -{amp}gt; [1, 5] — -{amp}gt; [3, 4] -{amp}gt; [1, 3, 4, 5, 6]).

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

mergeSort: function(arr, delay = 10000) { if (arr.length {amp}lt;= 1) { return arr; } let leftHalf = arr.splice(0, Math.floor(arr.length / 2)); let rightHalf = arr.splice(0, arr.length); let left = algorithm.mergeSort.call(this, leftHalf, delay - 300); let right = algorithm.mergeSort.call(this, rightHalf, delay - 600); arr = merge.call(this, left, right); setDelay.call(this, arr, delay); return arr; } function merge(left, right, sortedArray = []) { while (left.length {amp}gt; 0 {amp}amp;{amp}amp; right.length {amp}gt; 0) { if (left[0].height {amp}lt; right[0].height) { sortedArray = [...sortedArray, left.shift()]; } else { sortedArray = [...sortedArray, right.shift()]; } } while (left.length {amp}gt; 0) { sortedArray = [...sortedArray, left.shift()]; } while (right.length {amp}gt; 0) { sortedArray = [...sortedArray, right.shift()]; } return sortedArray; } function setDelay(input, delay) { setTimeout(() ={amp}gt; { this.setState({ arr: input }) }, delay); } 

предыдущие алгоритмы сортировки я решил с помощью рекурсии, имитируя процесс цикла for / while как

 this.setState({ arr: arr, isSorted: false }, () ={amp}gt; setTimeout( () ={amp}gt; algorithm.bubbleSort.call( this, this.state.arr, index   1, counter ), 30 ) 

… Это, к сожалению, неосуществимо для сортировки слиянием из-за процесса «раскручивания», как части рекурсивной сортировки, насколько я понимаю.

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

alexg1990

новый участник этого сайта. Будьте внимательны, спрашивая разъяснения, комментируя и отвечая. Проверьте наш

Правила поведения

,