UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

91 lines (90 loc) 2.45 kB
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 };