В настоящее время я пытаюсь реализовать mergeSort в Javascript. Я получаю следующую ошибку:
Пользователи / stevenaguilar / Рабочий стол / алгоритмы / слияние / сортировка слиянием. js: 36 сортировка (a, lo, hi) {^ RangeError: Максимальный размер стека вызовов превышено в Merge.sort (/Users/stevenaguilar/Desktop/algorithms/merge/merge-sort.js:36:7)
Вход не такой большой, элемент с 16 элементами в нем.
a = ["M", "E", "R", "G", "E", "S", "O", "R", "T", "E", "X", "A","M", "P", "L", "E"]
Я смог создать сортировку слиянием с Ruby и смог отсортировать массив. Не уверен, почему я получаю вышеуказанную ошибку с JavaScript, так как я запускаю Node v14.0.0
, вот реализация сортировки слиянием:
class Merge {
constructor() {
this.aux = []
}
sortPublic(a) {
this.sort(a, 0, a.length - 1);
}
merge(a, lo, mid, hi) {
let i = lo
let j = hi
var mid = mid + 1
for(let k = lo; k <= hi; k++) {
this.aux[k] = a[k]
}
for(let k = lo; k <= hi; k++) {
if(i > mid) {
a[k] = this.aux[j++]
}
else if(j > hi) {
a[k] = this.aux[i++]
}
else if(this.aux[j] < this.aux[i]) {
a[k] = this.aux[j++]
}
else {
a[k] = this.aux[i++]
}
}
}
sort(a, lo, hi) {
if(lo >= hi) { return; }
var mid = lo + (lo + hi) / 2
this.sort(a, lo, mid)
this.sort(a, mid + 1, hi)
this.merge(a, lo, mid, hi)
}
}
let mergeSort = new Merge;
console.log(mergeSort)
let a = ["M", "E", "R", "G", "E", "S", "O", "R", "T", "E", "X", "A", "M", "P", "L", "E"]
mergeSort.sortPublic(a);
В чем здесь проблема?