Я пытаюсь сделать визуализатор алгоритма сортировки, используя Angular. В настоящее время выполняется сортировка слиянием, и это доставляет мне проблемы. Я программист Java, поэтому я думаю, что я что-то делаю не так с машинописным текстом с рекурсивными вызовами. Когда я запускаю программу, она выдает ошибку, говоря, что «не могу прочитать длину свойства undefined». Я потерялся и не могу понять, где я ошибаюсь.
В моей первой функции я неоднократно разбивал исходный массив с именем visualArr, который является глобальным массивом в моей программе, размер которого определяется пользователем, и используется для визуализации алгоритмов сортировки. Затем вторая функция, которая у меня есть, используется для слияния разделенных массивов.
performMergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
const middle = Math.floor(arr.length / 2);
let left = arr.slice(0, middle);
let right = arr.slice(middle, arr.length);
left = this.performMergeSort(left);
right = this.performMergeSort(right);
return this.performMerge(left, right);
}
Функция таймера во втором блоке кода используется для визуальных эффектов сортировки. Однако я думаю, что что-то не так с моим logi c или что-то я делаю неправильно в TypeScript. Любые отзывы приветствуются.
performMerge(leftArr, rightArr) {
let lIdx = 0;
let rIdx = 0;
let i = 0;
timer(0, 100)
.pipe(takeWhile(() => leftArr.length > lIdx && rightArr.length > rIdx))
.subscribe(() => {
const lItem = leftArr[lIdx];
const rItem = rightArr[rIdx];
if (lItem > rItem) {
this.visualArr[i] = rItem;
rIdx++;
} else {
this.visualArr[i] = lItem;
lIdx++;
}
i++;
});
timer(0, 100)
.pipe(takeWhile(() => leftArr.length > lIdx ))
.subscribe(() => {
this.visualArr[lIdx] = leftArr[lIdx++];
});
timer(0, 100)
.pipe(takeWhile(() => rightArr.length > rIdx ))
.subscribe(() => {
this.visualArr[rIdx] = rightArr[rIdx++];
});
}