I wrote a quicksort version for fun for another question ( Javascript Double sorting algorithm ), which I have no idea if it is completely reliable. It was originally intended to sort only strings or just numbers, but it seems to have been adapted to this case (I changed the functions isNumber and less):
function isNumber(x,y) { return (map[x]); } function less(a,b,y){ return y ? a < b : map[a] < map[b]; } function swap(a, i, j) { var t = a[i]; a[i] = a[j]; a[j] = t; } function partition(array, pivot, left, right, what) { var store = left, pivotValue = array[pivot]; swap(array, pivot, right); for (var v = left; v < right; v++) { if (less(array[v],pivotValue,what) && isNumber(array[v],what)) { swap(array, v, store); store++; } } while(!isNumber(array[store],what)) store++; swap(array, right, store); return store; } function doubleQSort(array, left, right, what) { while(!isNumber(array[right],what) && right > left) right--; while(!isNumber(array[left],what) && left < right) left++; var pivot = null; if (left < right) { pivot = (right + left) >> 1; while(!isNumber(array[pivot],what)) pivot--; newPivot = partition(array, pivot, left, right, what); doubleQSort(array, left, newPivot - 1,what); doubleQSort(array, newPivot + 1, right,what); } }
Output:
var things = ['a', 'b', 'c', 'd', 'e']; var map = {'b':1, 'e':2, 'd':3} doubleQSort(things,0,things.length - 1); console.log(things)