Created
September 9, 2020 14:06
-
-
Save hjzheng/6170b59e34353242ca28ed709d40d05f to your computer and use it in GitHub Desktop.
优先队列,默认大顶堆
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class PriorityQueue { | |
constructor(data = [], compare = defaultCompare) { | |
this.data = data | |
this.length = this.data.length | |
this.compare = compare | |
if (this.length > 0) { | |
for (let i = (this.length >> 1) - 1; i >= 0; i--) this._down(i) | |
} | |
} | |
enQueue(item) { | |
this.data.push(item) | |
this.length ++ | |
this._up(this.length - 1) | |
} | |
deQueue() { | |
if (this.length === 0) return undefined | |
const top = this.data[0] | |
const bottom = this.data.pop() | |
this.length -- | |
if (this.length > 0) { | |
this.data[0] = bottom | |
this._down(0) | |
} | |
return top | |
} | |
_up(pos) { | |
const {data, compare} = this | |
const item = data[pos] | |
while (pos > 0) { | |
const parent = (pos - 1) >> 1 | |
const current = data[parent] | |
if (compare(item, current) >= 0) break | |
data[pos] = current | |
pos = parent | |
} | |
data[pos] = item | |
} | |
_down(pos) { | |
const {data, compare} = this | |
const halfLength = this.length >> 1 | |
const item = data[pos] | |
while (pos < halfLength) { | |
let left = (pos << 1) + 1 | |
let best = data[left] | |
const right = left + 1 | |
if (right < this.length && compare(data[right], best) < 0) { | |
left = right | |
best = data[right] | |
} | |
if (compare(best, item) >= 0) break | |
data[pos] = best | |
pos = left | |
} | |
data[pos] = item | |
} | |
} | |
function defaultCompare(a, b) { | |
return a < b ? -1 : a > b ? 1 : 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment