Реализации алгоритмов/Сортировка/Быстрая: различия между версиями

Содержимое удалено Содержимое добавлено
Отмена правки 157182, сделанной Slimbde (обсуждение) кажется вандализм
Метка: отмена
Строка 537:
== [[JavaScript]] ==
 
<source lang="javascript" line="1">
/*
function srt(arr)
* Алгоритм быстрой сортировки
{
{*
if (arr instanceof Array)
* @param data Array
{
* @param compare function(a, b) - возвращает 0 если a=b, -1 если a<b и 1 если a>b (необязательная)
if (arr.length < 2)
* @param change function(a, i, j) - меняет местами i-й и j-й элементы массива а (необязательная)
return arr;
}*
*/
const qsort = (data, compare, change) => {
let a = data,
f_compare = compare,
f_change = change;
 
if (!(a instanceof Array)) { // Данные не являются массивом
/*------------------------------+
return undefined;
| [left][base] |
};
+------------------------------*/
if (f_compare === undefined) { // Будем использовать простую функцию (для чисел)
let baseIndex = arr.length - 1;
f_compare = (a, b) => {
for (let i = 0; i < baseIndex; ++i)
if (a === b) {
{
return 0;
if (+arr[i] >= +arr[baseIndex])
} else if (a > b) {
{
return 1;
arr.push(arr.splice(i--, 1)[0]);
} else {
--baseIndex;
return -1;
}
}
}
}
};
if (f_change === undefined) { // Будем использовать простую смену (для чисел)
f_change = (a, i, j) => {
const temp = a[i];
a[i] = a[j];
a[j] = temp;
}
};
 
const qs = (l, r) => {
/*------------------------------+
let i = l,
| [left][base][rest] |
j = r,
+------------------------------*/
x = a[l+r>>1];
let left = arr.splice(0, baseIndex);
//x = a[Math.floor(Math.random()*(r-l+1))+l];
let base = arr.splice(0, 1);
// x = a[l]; // Если нет желания использовать объект Math
// now arr is the rest of it
 
while (i <= j) {
return srt(left).concat(base, srt(arr));
while (f_compare(a[i], x) === -1) {
}
i++;
 
}
return undefined;
while (f_compare(a[j], x) === 1) {
j--;
}
if (i <= j) {
f_change(a, i++, j--);
}
}
if (l < j) {
qs(l, j);
}
if (i < r) {
qs(i, r);
}
qs(0, a.length - 1);
}
}
</source>