Проблема в том, что вы фильтруете, оставляя только те элементы, которые строго ниже (<
) или строго выше (>
), чем ваш пивот.
Это можно исправить, изменив одно из следующих значений: ваши условия <=
вместо <
(или >=
вместо >
). Обратите внимание, что когда вы делаете это, вы должны убедиться, что элемент pivot вынут из массива.
Итак, в этой строке:
var left = quickSort(array.filter(item =>item < pivot));
Мы можем вывести pivot, вызвав array.slice(1)
(обратите внимание, что это не очень эффективно, см. Модифицированное решение в конце). Затем мы изменяем условие на <=
, и окончательный код становится следующим:
function quickSort(array) {
if (array.length <= 1) return array;
var pivot = array[0];
var left = quickSort(array.slice(1).filter(item =>item <= pivot));
var right = quickSort(array.filter(item =>item > pivot));
//console.log('left ',left);
//console.log("right ",right);
return [...left,pivot,...right];
}
console.log(quickSort([5, 4, 3, 2, 1, 1, 2])); // [1, 1, 2, 2, 3, 4, 5]
Более элегантным решением было бы удалить стержень из массива перед его фильтрацией. Вместо использования слайса вы можете использовать shift()
, чтобы удалить первый элемент из массива. Модифицированное решение становится:
function quickSort(array) {
if (array.length <= 1) return array;
var pivot = array[0];
// Remove first element
array.shift()
var left = quickSort(array.filter(item =>item <= pivot));
var right = quickSort(array.filter(item =>item > pivot));
return [...left,pivot,...right];
}
console.log(quickSort([5, 4, 3, 2, 1, 1, 2])); // [1, 1, 2, 2, 3, 4, 5]