Skip to content

Instantly share code, notes, and snippets.

@JetLua
Last active May 31, 2022 03:21
Show Gist options
  • Save JetLua/8d4f79e0cb0476372425c4b94170913d to your computer and use it in GitHub Desktop.
Save JetLua/8d4f79e0cb0476372425c4b94170913d to your computer and use it in GitHub Desktop.
function sort<T>(list: Array<T>, cmp?: (a: T, b: T) => number) {
const {length} = list
if (length < 2) return list
cmp ??= (x, y) => (x as unknown as number) - (y as unknown as number)
let unit = 1
let results = [] as Array<T>
while (length > unit) {
for (let i = 0; i < length; i += unit * 2) {
const m = i
const p = Math.min(m + unit, length - 1)
const n = p - 1
const q = Math.min(p + unit, length) - 1
let k = m
let j = p
while (k <= n || j <= q) {
if (k <= n && j <= q) {
if (cmp(list[k], list[j]) > 0) {
results.push(list[j])
j++
} else {
results.push(list[k])
k++
}
} else if (k <= n) {
results.push(list[k])
k++
} else if (j <= q) {
results.push(list[j])
j++
}
}
}
list = results
results = []
unit *= 2
}
return list
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment