143 lines
6.0 KiB
JavaScript
143 lines
6.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.sort_heap = exports.is_heap_until = exports.is_heap = exports.pop_heap = exports.push_heap = exports.make_heap = void 0;
|
|
var comparators_1 = require("../functional/comparators");
|
|
var global_1 = require("../iterator/global");
|
|
/* =========================================================
|
|
EA-STL (https://github.com/electronicarts/EASTL/blob/master/include/EASTL/heap.h)
|
|
- PUSH & POP
|
|
- SORT
|
|
- INTERNAL
|
|
============================================================
|
|
PUSH & POP
|
|
--------------------------------------------------------- */
|
|
/**
|
|
* Make a heap.
|
|
*
|
|
* @param first Random access iteartor of the first position.
|
|
* @param last Random access iterator of the last position.
|
|
* @param comp A binary function predicates *x* element would be placed before *y*. When returns `true`, then *x* precedes *y*. Default is {@link less}.
|
|
*/
|
|
function make_heap(first, last, comp) {
|
|
if (comp === void 0) { comp = comparators_1.less; }
|
|
var heapSize = (0, global_1.distance)(first, last);
|
|
if (heapSize < 2)
|
|
return;
|
|
var parentPosition = ((heapSize - 2) >> 1) + 1;
|
|
do {
|
|
var temp = first.advance(--parentPosition).value;
|
|
_Adjust_heap(first, parentPosition, heapSize, parentPosition, temp, comp);
|
|
} while (parentPosition !== 0);
|
|
}
|
|
exports.make_heap = make_heap;
|
|
/**
|
|
* Push an element into heap.
|
|
*
|
|
* @param first Random access iteartor of the first position.
|
|
* @param last Random access iterator of the last position.
|
|
* @param comp A binary function predicates *x* element would be placed before *y*. When returns `true`, then *x* precedes *y*. Default is {@link less}.
|
|
*/
|
|
function push_heap(first, last, comp) {
|
|
if (comp === void 0) { comp = comparators_1.less; }
|
|
var temp = last.prev().value;
|
|
_Promote_heap(first, 0, (0, global_1.distance)(first, last) - 1, temp, comp);
|
|
}
|
|
exports.push_heap = push_heap;
|
|
/**
|
|
* Pop an element from heap.
|
|
*
|
|
* @param first Random access iteartor of the first position.
|
|
* @param last Random access iterator of the last position.
|
|
* @param comp A binary function predicates *x* element would be placed before *y*. When returns `true`, then *x* precedes *y*. Default is {@link less}.
|
|
*/
|
|
function pop_heap(first, last, comp) {
|
|
if (comp === void 0) { comp = comparators_1.less; }
|
|
var bottom = last.prev();
|
|
var temp = bottom.value;
|
|
bottom.value = first.value;
|
|
_Adjust_heap(first, 0, (0, global_1.distance)(first, last) - 1, 0, temp, comp);
|
|
}
|
|
exports.pop_heap = pop_heap;
|
|
/* ---------------------------------------------------------
|
|
SORT
|
|
--------------------------------------------------------- */
|
|
/**
|
|
* Test whether a range is heap.
|
|
*
|
|
* @param first Bi-directional iteartor of the first position.
|
|
* @param last Bi-directional iterator of the last position.
|
|
* @param comp A binary function predicates *x* element would be placed before *y*. When returns `true`, then *x* precedes *y*. Default is {@link less}.
|
|
*
|
|
* @return Whether the range is heap.
|
|
*/
|
|
function is_heap(first, last, comp) {
|
|
if (comp === void 0) { comp = comparators_1.less; }
|
|
var it = is_heap_until(first, last, comp);
|
|
return it.equals(last);
|
|
}
|
|
exports.is_heap = is_heap;
|
|
/**
|
|
* Find the first element not in heap order.
|
|
*
|
|
* @param first Bi-directional iteartor of the first position.
|
|
* @param last Bi-directional iterator of the last position.
|
|
* @param comp A binary function predicates *x* element would be placed before *y*. When returns `true`, then *x* precedes *y*. Default is {@link less}.
|
|
*
|
|
* @return Iterator to the first element not in heap order.
|
|
*/
|
|
function is_heap_until(first, last, comp) {
|
|
if (comp === void 0) { comp = comparators_1.less; }
|
|
var counter = 0;
|
|
for (var child = first.next(); _Comp_it(child, last.index()); child = child.next(), counter ^= 1) {
|
|
if (comp(first.value, child.value))
|
|
return child;
|
|
first = (0, global_1.advance)(first, counter);
|
|
}
|
|
return last;
|
|
}
|
|
exports.is_heap_until = is_heap_until;
|
|
/**
|
|
* Sort elements of a heap.
|
|
*
|
|
* @param first Random access iteartor of the first position.
|
|
* @param last Random access iterator of the last position.
|
|
* @param comp A binary function predicates *x* element would be placed before *y*. When returns `true`, then *x* precedes *y*. Default is {@link less}.
|
|
*/
|
|
function sort_heap(first, last, comp) {
|
|
if (comp === void 0) { comp = comparators_1.less; }
|
|
for (; (0, global_1.distance)(first, last) > 1; last = last.prev())
|
|
pop_heap(first, last, comp);
|
|
}
|
|
exports.sort_heap = sort_heap;
|
|
/* ---------------------------------------------------------
|
|
INTERNAL
|
|
--------------------------------------------------------- */
|
|
function _Promote_heap(first, topPosition, position, value, comp) {
|
|
for (var parentPosition = (position - 1) >> 1; position > topPosition &&
|
|
comp(first.advance(parentPosition).value, value); parentPosition = (position - 1) >> 1) {
|
|
first.advance(position).value = first.advance(parentPosition).value;
|
|
position = parentPosition;
|
|
}
|
|
first.advance(position).value = value;
|
|
}
|
|
function _Adjust_heap(first, topPosition, heapSize, position, value, comp) {
|
|
var childPosition = 2 * position + 2;
|
|
for (; childPosition < heapSize; childPosition = 2 * childPosition + 2) {
|
|
if (comp(first.advance(childPosition).value, first.advance(childPosition - 1).value))
|
|
--childPosition;
|
|
first.advance(position).value = first.advance(childPosition).value;
|
|
position = childPosition;
|
|
}
|
|
if (childPosition === heapSize) {
|
|
first.advance(position).value = first.advance(childPosition - 1).value;
|
|
position = childPosition - 1;
|
|
}
|
|
_Promote_heap(first, topPosition, position, value, comp);
|
|
}
|
|
function _Comp_it(x, y) {
|
|
if (x.base instanceof Function)
|
|
return y < x;
|
|
else
|
|
return x < y;
|
|
}
|
|
//# sourceMappingURL=heap.js.map
|