function quicksortDijkstra(arr) { var N = arr.length, actions = []; //recursive sort call with n*log(n) average case complexity function sort(a, lo, hi) { if(lo >= hi) return; var lt = lo, i = lo + 1, gt = hi, v = a[lo]; // partition value while(i <= gt) { // elements i through gt are unexamined var diff = a[i] - v; if (diff < 0) swap(a, lt++, i++); else if (diff > 0) swap(a, i, gt--); else { i++; // equal to key, do keep contiguous stretch going } actions.push({type: "partition", lo: lo, lt: lt, i: i, gt: gt, hi: hi}); } sort(a, lo, lt - 1); sort(a, gt + 1, hi); } function swap(arr, i, j) { var t = arr[i]; arr[i] = arr[j]; arr[j] = t; actions.push({type: "swap", i: i, j: j}); } sort(arr, 0, N-1); return actions; } // Node or browser? if (typeof window === 'undefined') { module.exports = quicksort; } else { window.quicksortDijkstra = quicksortDijkstra; }