Files
ValueScript/inputs/passing/mergeSort.ts
Andrew Morris bc1afa24c4 Add more tests
2023-02-28 15:28:06 +11:00

54 lines
1.1 KiB
TypeScript

// test_output! [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
export default function main() {
const x = [7, 18, 9, 11, 16, 3, 8, 2, 5, 4, 6, 14, 15, 17, 10, 12, 1, 13];
return mergeSort(x, (a, b) => a - b);
}
function mergeSort<T>(vals: T[], cmp: (a: T, b: T) => number): T[] {
const len = vals.length;
if (len <= 1) {
return vals;
}
if (len === 2) {
if (cmp(vals[0], vals[1]) > 0) {
return [vals[1], vals[0]];
}
return vals;
}
const mid = vals.length / 2;
const leftSorted = mergeSort(vals.slice(0, mid), cmp);
const rightSorted = mergeSort(vals.slice(mid), cmp);
let res: T[] = [];
let left = 0;
const leftLen = leftSorted.length;
let right = 0;
const rightLen = rightSorted.length;
while (left < leftLen && right < rightLen) {
if (cmp(leftSorted[left], rightSorted[right]) <= 0) {
res.push(leftSorted[left++]);
} else {
res.push(rightSorted[right++]);
}
}
while (left < leftLen) {
res.push(leftSorted[left++]);
}
while (right < rightLen) {
res.push(rightSorted[right++]);
}
return res;
}