/** * */ var Sorter = function() { this.data = []; this.shuffled = []; this.ordered = []; this.actions = []; this.comparisons = []; }; // NOTE fisher-yates, http://bost.ocks.org/mike/algorithms/ /** * Returns copy of an array shuffled using Fisher-Yates. */ Sorter.prototype.shuffle = function(arr) { var result = Object.create(arr); var n = result.length, t, i; while (n) { i = Math.random() * n-- | 0; // 0 ≤ i < n t = result[n]; result[n] = result[i]; result[i] = t; } return result; }; /** * */ Sorter.prototype.sort = function() { throw new Error('Sorter.sort() method override required.'); }; /** * */ Sorter.prototype.init = function() { throw new Error('Sorter.init() method override required.'); }; /** * */ Sorter.prototype.instruct = function() { this.actions.push(arguments); return this; }; /** * */ Sorter.prototype.generate = function(n) { this.data = []; var upper = Math.floor(Math.random() * 300 + 100 + n); for (var i = 0; i < n; i++) { this.data.push(Math.floor(i * upper / n)); }; this.shuffled = this.shuffle(this.data); this.ordered = this.shuffled.slice(); this.init(); this.sort(this.ordered, 0, this.ordered.length - 1); return this.actions; };