Skip to content

Instantly share code, notes, and snippets.

@melikhov-dev
Last active May 8, 2022 14:07
Show Gist options
  • Save melikhov-dev/740db4d3f2ba7e58b10de401c94da926 to your computer and use it in GitHub Desktop.
Save melikhov-dev/740db4d3f2ba7e58b10de401c94da926 to your computer and use it in GitHub Desktop.
const qsort = (arr) => {
if (arr.length < 2) {
return arr;
} else {
// Опорная точка для деления массива, выбирается случайно
const pivotPosition = Math.floor(Math.random() * arr.length);
const pivot = arr[pivotPosition];
// Значения меньшие, либо равные опорному
// попадают в новый массив less
const less = arr.filter((value, index) => {
const isPivot = index === pivotPosition;
return !isPivot && (value <= pivot);
});
// Значения, которые больше опорного
// попадают в новый массив less
const greater = arr.filter(value => value > pivot);
/***
/* Более оптимальное решение — использовать цикл и разделить массив за одну итерацию
/* let less = [];
/* let greater = [];
/* for (let i = 0; i < arr.length; i++) {
/* const isPivot = i === pivotPosition;
/* if(arr[i] <= pivot && !isPivot) {
/* less.push(arr[i])
/* } else if (arr[i] > pivot) {
/* greater.push(arr[i]);
/* }
/*}
**/
return [...qsort(less), pivot, ...qsort(greater)];
}
};
const arr = [1, 213, 3, 5, 2, 8, 7];
console.log(qsort(arr));
@boombang
Copy link

По-моему у вас ошибка, которая заключается в том, что в методе filter при проверке меньшего либо равного значения надо добавить еще и проверку того, чтобы не сравнивался pivot сам с собой, иначе получается что pivot будет дублироваться.

@melikhov-dev
Copy link
Author

@boombang да, спасибо, добавил проверку

@kaineer
Copy link

kaineer commented Mar 12, 2018

@yurashalya
Copy link

Как замедлить алгоритм, чтобы он при выполнении сортировал массив через определенное кол-во времени (чтобы показать пользователю как выполняется сортировка под катопом)?

@jinnyMcKindy
Copy link

jinnyMcKindy commented Mar 10, 2019

if (arr.length < 2) { return arr; } else {
Тут else можно убрать, т.к. return равной выйдет из функции и последующий код не исполнится.

@rapackivi
Copy link

Автору спасибо огромное, первый раз увидел реализацию на рекурсии, как в теории. А то - вечно через переставления индексов показывают. Да - через рекурсию ресурсозатратно. Да. Но ведь красиво же!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment