kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
132 lines (127 loc) • 12.4 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = quickInsertionSort;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
/**
* Inplace quick insertion sorting algorithm for numeric values
* 1. using a stack to eliminate recursion
* 2. sorting inplace to reduce memory usage
* 3. using insertion sort for small partition sizes
* The original source code is from:
* https://www.measurethat.net/Benchmarks/Show/3549/0/javascript-sorting-algorithms
* https://quick.work/?page=view-blog&id=24
*
* @param arr
*/
function quickInsertionSort(arr) {
if (!arr || arr.length < 1) {
return;
}
var stack = [];
stack.push([0, arr.length, 2 * Math.floor(Math.log(arr.length) / Math.log(2))]);
while (stack.length > 0) {
var _stack = (0, _slicedToArray2["default"])(stack[stack.length - 1], 3),
start = _stack[0],
end = _stack[1],
depth = _stack[2];
stack.pop();
if (depth === 0) {
// for worst case of quick sort: too many partitions
shellSortBound(arr, start, end);
} else {
var pivot = Math.round((start + end) / 2);
var pivotNewIndex = inplaceQuicksortPartition(arr, start, end, pivot);
// more than 32 elements: faster to be sorted in QuickSort partition
// less than 32 elements: faster to be sorted in InsertionSort
if (end - pivotNewIndex > 16) {
stack.push([pivotNewIndex, end, depth - 1]);
}
if (pivotNewIndex - start > 16) {
stack.push([start, pivotNewIndex, depth - 1]);
}
}
}
insertionSort(arr);
}
/**
* shellsort is a generalization of insertion sort
* shellsort perform best on partially sorted array
* Don't use shellsort on array (>10k)
* @param arr
* @param start
* @param end
*
* Learn more about Shellsort at https://en.wikipedia.org/wiki/Shellsort
*/
function shellSortBound(arr, start, end) {
if (arr.length <= 1) return;
var inc = Math.round((start + end) / 2);
var i;
var j;
var t;
while (inc > start) {
for (i = inc; i < end; i++) {
t = arr[i];
j = i;
while (j >= inc && arr[j - inc] > t) {
arr[j] = arr[j - inc];
j -= inc;
}
arr[j] = t;
}
inc = Math.round((inc - start) / 2.2 + start);
}
}
/**
* Insertion sort
* @param arr
*/
function insertionSort(arr) {
for (var i = 1, l = arr.length; i < l; i++) {
var value = arr[i];
var j = void 0;
for (j = i - 1; j >= 0; j--) {
if (arr[j] <= value) break;
arr[j + 1] = arr[j];
}
arr[j + 1] = value;
}
}
/**
* In-place quick sort
* @param arr
* @param start
* @param end
* @param pivotIndex
* @returns number
*/
function inplaceQuicksortPartition(arr, start, end, pivotIndex) {
var i = start;
var j = end;
var pivot = arr[pivotIndex];
var partition = true;
while (partition) {
while (arr[i] < pivot) {
i++;
}
j--;
while (pivot < arr[j]) {
j--;
}
if (!(i < j)) {
return i;
}
// swap(arr, i, j);
var t = arr[i];
arr[i] = arr[j];
arr[j] = t;
i++;
}
return i;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJxdWlja0luc2VydGlvblNvcnQiLCJhcnIiLCJsZW5ndGgiLCJzdGFjayIsInB1c2giLCJNYXRoIiwiZmxvb3IiLCJsb2ciLCJfc3RhY2siLCJfc2xpY2VkVG9BcnJheTIiLCJzdGFydCIsImVuZCIsImRlcHRoIiwicG9wIiwic2hlbGxTb3J0Qm91bmQiLCJwaXZvdCIsInJvdW5kIiwicGl2b3ROZXdJbmRleCIsImlucGxhY2VRdWlja3NvcnRQYXJ0aXRpb24iLCJpbnNlcnRpb25Tb3J0IiwiaW5jIiwiaSIsImoiLCJ0IiwibCIsInZhbHVlIiwicGl2b3RJbmRleCIsInBhcnRpdGlvbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWljay1pbnNlcnRpb24tc29ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vKipcbiAqIElucGxhY2UgcXVpY2sgaW5zZXJ0aW9uIHNvcnRpbmcgYWxnb3JpdGhtIGZvciBudW1lcmljIHZhbHVlc1xuICogMS4gdXNpbmcgYSBzdGFjayB0byBlbGltaW5hdGUgcmVjdXJzaW9uXG4gKiAyLiBzb3J0aW5nIGlucGxhY2UgdG8gcmVkdWNlIG1lbW9yeSB1c2FnZVxuICogMy4gdXNpbmcgaW5zZXJ0aW9uIHNvcnQgZm9yIHNtYWxsIHBhcnRpdGlvbiBzaXplc1xuICogVGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGlzIGZyb206XG4gKiBodHRwczovL3d3dy5tZWFzdXJldGhhdC5uZXQvQmVuY2htYXJrcy9TaG93LzM1NDkvMC9qYXZhc2NyaXB0LXNvcnRpbmctYWxnb3JpdGhtc1xuICogaHR0cHM6Ly9xdWljay53b3JrLz9wYWdlPXZpZXctYmxvZyZpZD0yNFxuICpcbiAqIEBwYXJhbSBhcnJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVpY2tJbnNlcnRpb25Tb3J0KGFycjogbnVtYmVyW10pOiB2b2lkIHtcbiAgaWYgKCFhcnIgfHwgYXJyLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc3RhY2s6IG51bWJlcltdW10gPSBbXTtcbiAgc3RhY2sucHVzaChbMCwgYXJyLmxlbmd0aCwgMiAqIE1hdGguZmxvb3IoTWF0aC5sb2coYXJyLmxlbmd0aCkgLyBNYXRoLmxvZygyKSldKTtcblxuICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IFtzdGFydCwgZW5kLCBkZXB0aF0gPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgICBzdGFjay5wb3AoKTtcblxuICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgLy8gZm9yIHdvcnN0IGNhc2Ugb2YgcXVpY2sgc29ydDogdG9vIG1hbnkgcGFydGl0aW9uc1xuICAgICAgc2hlbGxTb3J0Qm91bmQoYXJyLCBzdGFydCwgZW5kKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGl2b3QgPSBNYXRoLnJvdW5kKChzdGFydCArIGVuZCkgLyAyKTtcbiAgICAgIGNvbnN0IHBpdm90TmV3SW5kZXggPSBpbnBsYWNlUXVpY2tzb3J0UGFydGl0aW9uKGFyciwgc3RhcnQsIGVuZCwgcGl2b3QpO1xuICAgICAgLy8gbW9yZSB0aGFuIDMyIGVsZW1lbnRzOiBmYXN0ZXIgdG8gYmUgc29ydGVkIGluIFF1aWNrU29ydCBwYXJ0aXRpb25cbiAgICAgIC8vIGxlc3MgdGhhbiAzMiBlbGVtZW50czogZmFzdGVyIHRvIGJlIHNvcnRlZCBpbiBJbnNlcnRpb25Tb3J0XG4gICAgICBpZiAoZW5kIC0gcGl2b3ROZXdJbmRleCA+IDE2KSB7XG4gICAgICAgIHN0YWNrLnB1c2goW3Bpdm90TmV3SW5kZXgsIGVuZCwgZGVwdGggLSAxXSk7XG4gICAgICB9XG4gICAgICBpZiAocGl2b3ROZXdJbmRleCAtIHN0YXJ0ID4gMTYpIHtcbiAgICAgICAgc3RhY2sucHVzaChbc3RhcnQsIHBpdm90TmV3SW5kZXgsIGRlcHRoIC0gMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpbnNlcnRpb25Tb3J0KGFycik7XG59XG5cbi8qKlxuICogc2hlbGxzb3J0IGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgaW5zZXJ0aW9uIHNvcnRcbiAqIHNoZWxsc29ydCBwZXJmb3JtIGJlc3Qgb24gcGFydGlhbGx5IHNvcnRlZCBhcnJheVxuICogRG9uJ3QgdXNlIHNoZWxsc29ydCBvbiBhcnJheSAoPjEwaylcbiAqIEBwYXJhbSBhcnJcbiAqIEBwYXJhbSBzdGFydFxuICogQHBhcmFtIGVuZFxuICpcbiAqIExlYXJuIG1vcmUgYWJvdXQgU2hlbGxzb3J0IGF0IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NoZWxsc29ydFxuICovXG5mdW5jdGlvbiBzaGVsbFNvcnRCb3VuZChhcnI6IG51bWJlcltdLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICBpZiAoYXJyLmxlbmd0aCA8PSAxKSByZXR1cm47XG4gIGxldCBpbmMgPSBNYXRoLnJvdW5kKChzdGFydCArIGVuZCkgLyAyKTtcbiAgbGV0IGk7XG4gIGxldCBqO1xuICBsZXQgdDtcblxuICB3aGlsZSAoaW5jID4gc3RhcnQpIHtcbiAgICBmb3IgKGkgPSBpbmM7IGkgPCBlbmQ7IGkrKykge1xuICAgICAgdCA9IGFycltpXTtcbiAgICAgIGogPSBpO1xuICAgICAgd2hpbGUgKGogPj0gaW5jICYmIGFycltqIC0gaW5jXSA+IHQpIHtcbiAgICAgICAgYXJyW2pdID0gYXJyW2ogLSBpbmNdO1xuICAgICAgICBqIC09IGluYztcbiAgICAgIH1cbiAgICAgIGFycltqXSA9IHQ7XG4gICAgfVxuICAgIGluYyA9IE1hdGgucm91bmQoKGluYyAtIHN0YXJ0KSAvIDIuMiArIHN0YXJ0KTtcbiAgfVxufVxuXG4vKipcbiAqIEluc2VydGlvbiBzb3J0XG4gKiBAcGFyYW0gYXJyXG4gKi9cbmZ1bmN0aW9uIGluc2VydGlvblNvcnQoYXJyOiBudW1iZXJbXSkge1xuICBmb3IgKGxldCBpID0gMSwgbCA9IGFyci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZSA9IGFycltpXTtcbiAgICBsZXQgajtcbiAgICBmb3IgKGogPSBpIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgIGlmIChhcnJbal0gPD0gdmFsdWUpIGJyZWFrO1xuICAgICAgYXJyW2ogKyAxXSA9IGFycltqXTtcbiAgICB9XG4gICAgYXJyW2ogKyAxXSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogSW4tcGxhY2UgcXVpY2sgc29ydFxuICogQHBhcmFtIGFyclxuICogQHBhcmFtIHN0YXJ0XG4gKiBAcGFyYW0gZW5kXG4gKiBAcGFyYW0gcGl2b3RJbmRleFxuICogQHJldHVybnMgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIGlucGxhY2VRdWlja3NvcnRQYXJ0aXRpb24oXG4gIGFycjogbnVtYmVyW10sXG4gIHN0YXJ0OiBudW1iZXIsXG4gIGVuZDogbnVtYmVyLFxuICBwaXZvdEluZGV4OiBudW1iZXJcbik6IG51bWJlciB7XG4gIGxldCBpID0gc3RhcnQ7XG4gIGxldCBqID0gZW5kO1xuICBjb25zdCBwaXZvdCA9IGFycltwaXZvdEluZGV4XTtcbiAgY29uc3QgcGFydGl0aW9uID0gdHJ1ZTtcbiAgd2hpbGUgKHBhcnRpdGlvbikge1xuICAgIHdoaWxlIChhcnJbaV0gPCBwaXZvdCkge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBqLS07XG4gICAgd2hpbGUgKHBpdm90IDwgYXJyW2pdKSB7XG4gICAgICBqLS07XG4gICAgfVxuICAgIGlmICghKGkgPCBqKSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICAgIC8vIHN3YXAoYXJyLCBpLCBqKTtcbiAgICBjb25zdCB0ID0gYXJyW2ldO1xuICAgIGFycltpXSA9IGFycltqXTtcbiAgICBhcnJbal0gPSB0O1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gaTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FB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
;