Skip to content

Instantly share code, notes, and snippets.

@bhvaleri
Last active August 29, 2015 13:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bhvaleri/10754614 to your computer and use it in GitHub Desktop.
Save bhvaleri/10754614 to your computer and use it in GitHub Desktop.
Quicksort through colours
<!doctype html>
<html>
<style>
line {
stroke-width: 1.5px;
}
body {
background-color: black;
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script>
// heavily influenced by http://bl.ocks.org/mbostock/1582075
var width = 960,
height = 500;
var svg = d3.select('body').append('svg')
.attr('width', width)
.attr('height', height);
var centreX = width/2,
centreY = height/2;
var length = 200;
var shuffle = function (array) {
var m = array.length, t, i;
// While there remain elements to shuffle…
while (m) {
// Pick a remaining element…
i = Math.floor(Math.random() * m--);
// And swap it with the current element.
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}
var reset = function () {
hueValues = shuffle(d3.range(0, 360));
hueAndAngles = d3.range(0, 360).map(function (d) {
return {
angle: d,
hue: hueValues[d]
};
});
};
var draw = function () {
var line = svg.selectAll('line')
.data(hueAndAngles);
line.enter().append('line');
line.attr('stroke', function (d) { return 'hsl(' + d.hue + ',50%,50%)';})
.attr('x1', centreX)
.attr('y1', centreY)
.attr('x2', function (d) { return centreX + Math.cos(d.angle * 0.01745) * length; })
.attr('y2', function (d) { return centreY + Math.sin(d.angle * 0.01745) * length; });
};
var quicksort = function (array) {
var actions = [];
function partition(left, right, pivot) {
var v = array[pivot];
swap(pivot, --right);
for (var i = left; i < right; ++i) if (array[i] <= v) swap(i, left++);
swap(left, right);
return left;
}
function swap(i, j) {
var t = array[i];
array[i] = array[j];
array[j] = t;
actions.push({type: "swap", i: i, j: j});
}
function recurse(left, right) {
if (left < right) {
var pivot = left + ~~(Math.random() * (right - left));
actions.push({type: "partition", pivot: pivot});
pivot = partition(left, right, pivot);
recurse(left, pivot);
recurse(pivot + 1, right);
}
}
recurse(0, array.length);
return actions;
}
var sort = function () {
reset();
draw();
actions = quicksort(hueAndAngles.map(function(d) {
return d.hue;
})).reverse();
function step() {
var intervalId = setInterval(function () {
var action = actions.pop();
if (action) switch (action.type) {
case "partition": {
step();
break;
}
case "swap": {
var t = hueAndAngles[action.i].hue;
hueAndAngles[action.i].hue = hueAndAngles[action.j].hue;
hueAndAngles[action.j].hue = t;
draw();
break;
}
}
}, 100);
};
step();
}
sort()
</script>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment