diff --git a/ascent/src/features/ascent/sortingByDeletion.js b/ascent/src/features/ascent/sortingByDeletion.js index dc52a4ba12e2aecdba6250a57099bddce285806f..2d09ed9d9066d6ef02c19a7b5182b5ffcccebd61 100644 --- a/ascent/src/features/ascent/sortingByDeletion.js +++ b/ascent/src/features/ascent/sortingByDeletion.js @@ -1,3 +1,35 @@ +class Backpointer { + constructor(previousIndex, count) { + this.previousIndex = previousIndex; + this.count = count; + } +} + +function chooseBackpointer(list, backpointers) { + const currentIndex = backpointers.length; + const currentElement = currentIndex < list.length ? list[currentIndex] : Infinity; + let best = new Backpointer(undefined, 0); + for (let i = 0; i < currentIndex; ++i) { + if (list[i] <= currentElement) { + const candidate = new Backpointer(i, backpointers[i].count + 1); + if (candidate.count > best.count) { + best = candidate; + } + } + } + return best; +} + export function deleteToSort(list) { - return []; // TODO: stub + const backpointers = []; + while (backpointers.length <= list.length) { + backpointers.push(chooseBackpointer(list, backpointers)); + } + const reversedResults = []; + for (let current = backpointers[list.length].previousIndex; + current !== undefined; + current = backpointers[current].previousIndex) { + reversedResults.push(list[current]); + } + return reversedResults.reverse(); }