ArBitr_exe
@ArBitr_exe
Начинающий Web-разработчик

Как организовать быструю сортировку на JS со средним опорным элементом?

Пытаюсь реализовать быструю сортировку ( в учебных целях ), при выборе элемента массива в качестве опорного, все работает отлично , но при выборе среднего, сортировка работает некорректно ( вместо вывода 1,3,4,5,7 выводит 3,3,4,7,7 ), в чем может быть проблема?

function quickSort (array) {
	if (array.length - 1 < 1) {
		return array;
	}
	else {
		let pivot = array[Math.floor((array.length - 1) / 2)];
		let less  = [],
		greater = [];

		for (let i = 1; i < array.length; i++) {
			if (array[i] <= pivot) {
				less.push(array[i]);
			}
			else {
				greater.push(array[i]);
			}
		}
		let result = []
		return result.concat (quickSort(less), pivot, quickSort(greater));
	}
}
alert(quickSort([5,1,7,4,3]));
  • Вопрос задан
  • 522 просмотра
Решения вопроса 1
AngReload
@AngReload
Кратко о себе
Несколько мелких ошибок
function quickSort (array) {
	if (array.length <= 1) { // так понятнее
		return array;
	} else {
		let pivotIndex = Math.floor(array.length / 2); // так понятнее
		let pivot = array[pivotIndex];
		let less = [];
		let greater = []; // не объявляйте переменные через запятую

		for (let i = 0; i < array.length; i++) { // индексы элементов в массиве идут с нуля
			if (i === pivotIndex) continue; // опорный элмент нужно пропускать
			if (array[i] <= pivot) {
				less.push(array[i]);
			} else {
				greater.push(array[i]);
			}
		}
		let result = [];
		return result.concat(quickSort(less), pivot, quickSort(greater));
	}
}
console.log(quickSort([5,1,7,4,3])); // алерт?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
streetflush
@streetflush
проблема может быть во многом.
начиная с того, что
for (let i = 1; i < array.length; i++) {
теряет первый элемент массива.

заканчивая тем, что ваш pivot попадает в один из массивов и потом опять же участвует в их объединении
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы