robturtle
11/16/2016 - 8:42 PM

sortByIndex.js

function sortByIndex(indicies, elems, reverse = true) {
  let len = elems.length;
  var i = 0;
  var toPut = elems[i];
  while (i < len) {
    let correctIndex = reverse ? len - indicies[i] - 1 : indicies[i];
    if (i >= correctIndex) { ++i; } // one problem: there may be forwarding edges which are already processed
    else {
      var jmp = correctIndex;
      while (true) {
        let newJmp = reverse ? len - indicies[jmp] - 1 : indicies[jmp];
        let newToPut = elems[newJmp];
        elems[jmp] = toPut;
        if (jmp == i) {
          ++i;
          break;
        }
        toPut = newToPut;
        jmp = newJmp;
      };
    }
  }
  return elems;
}