cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
91 lines (90 loc) • 2.45 kB
JavaScript
function swap(arr, a, b) {
var tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
function partition(arr, pivot, left, right, compare) {
var storeIndex = left;
var pivotValue = arr[pivot];
swap(arr, pivot, right);
for (var v = left; v < right; v++) {
if (compare(arr[v], pivotValue) < 0) {
swap(arr, v, storeIndex);
storeIndex++;
}
}
swap(arr, right, storeIndex);
return storeIndex;
}
function quickSort(array, compare, left, right) {
if (left < right) {
var pivot = Math.floor((left + right) / 2);
var newPivot = partition(array, pivot, left, right, compare);
quickSort(array, compare, left, newPivot - 1);
quickSort(array, compare, newPivot + 1, right);
}
}
function ProgressiveQuickSort() {
this._parts = [];
}
ProgressiveQuickSort.prototype.step = function(arr, compare, frame) {
var len = arr.length;
if (frame === 0) {
this._parts = [];
this._sorted = false;
var pivot = Math.floor(len / 2);
this._parts.push({
pivot,
left: 0,
right: len - 1
});
this._currentSortPartIdx = 0;
}
if (this._sorted) {
return;
}
var parts = this._parts;
if (parts.length === 0) {
this._sorted = true;
return true;
} else if (parts.length < 512) {
for (var i = 0; i < parts.length; i++) {
parts[i].pivot = partition(arr, parts[i].pivot, parts[i].left, parts[i].right, compare);
}
var subdividedParts = [];
for (var i = 0; i < parts.length; i++) {
var left = parts[i].left;
var right = parts[i].pivot - 1;
if (right > left) {
subdividedParts.push({
pivot: Math.floor((right + left) / 2),
left,
right
});
}
var left = parts[i].pivot + 1;
var right = parts[i].right;
if (right > left) {
subdividedParts.push({
pivot: Math.floor((right + left) / 2),
left,
right
});
}
}
parts = this._parts = subdividedParts;
} else {
for (var i = 0; i < Math.floor(parts.length / 10); i++) {
var idx = parts.length - 1 - this._currentSortPartIdx;
quickSort(arr, compare, parts[idx].left, parts[idx].right);
this._currentSortPartIdx++;
if (this._currentSortPartIdx === parts.length) {
this._sorted = true;
return true;
}
}
}
return false;
};
ProgressiveQuickSort.sort = quickSort;
export { ProgressiveQuickSort as default };