Ответ 1
Я думаю, что проблема здесь в том, что ваш шаг разбиения не обязательно сокращает входной массив. Например, проследите, что произойдет, если вы попытаетесь сортировать [1, 2]. В этом случае ваш элемент pivot будет элементом 2. Так как 1 > 2 является ложным, в список l
добавляется 1. Так как 2 > 2 ложно, в список l
добавляется 2. В результате ваш рекурсивный вызов в списке l
будет иметь те же аргументы, что и ваш первоначальный вызов, что вызывает бесконечную рекурсию.
Чтобы исправить это, попробуйте разбить вход на три списка - одно из меньших значений, одно из равных значений и одно из больших значений. Этот код показан здесь:
function sort(data){
if (data.length < 2){
return data;
} else {
var l = [];
var r = [];
var e = [];
var i = 0;
var pivot = (data.length / 2) | 0;
for(i = 0; i < data.length; i++) {
if (data[i] > data[pivot]) {
r.push(data[i]);
} else if (data[i] < data[pivot]) {
l.push(data[i]);
} else {
e.push(data[i]);
}
}
return sort(l).concat(e, sort(r));
}
}
Эта новая версия явно группирует равные элементы в свой собственный список, поэтому они не рекурсивно сортируются по одному из рекурсивных вызовов. Он также изящно обрабатывает повторяющиеся элементы.
Надеюсь, это поможет!