Add parallel option to merge sort example.

This simply shows the merges happening in parallel.
This commit is contained in:
Jason Davies 2011-04-29 16:09:56 +01:00
Родитель 249c4f2f0f
Коммит f049cb0eaf
2 изменённых файлов: 27 добавлений и 8 удалений

Просмотреть файл

@ -8,9 +8,12 @@
</head>
<body>
<div id="chart">
<button class="first last" onclick="randomize()">
<button class="first last"
onclick="randomize(document.getElementById('parallel').checked)">
Restart
</button><p>
</button>
<label for="parallel"><input type="checkbox" id="parallel"/> Parallel</label>
<p>
</div>
<script type="text/javascript" src="sort.js"></script>
</body>

Просмотреть файл

@ -17,8 +17,8 @@ randomize();
var passes, i, timer = null;
function randomize() {
passes = mergesort(d3.range(n).map(Math.random));
function randomize(parallel) {
passes = mergesort(d3.range(n).map(Math.random), parallel);
i = 0;
if (timer != null) clearTimeout(timer);
update();
@ -52,25 +52,41 @@ function update() {
* each sequential pass.
* The first pass is performed at size = 2.
*/
function mergesort(array) {
function mergesort(array, parallel) {
var passes = [array.slice()], size = 2;
for (; size < array.length; size <<= 1) {
var chunks = [],
max = 0;
for (var i = 0; i < array.length;) {
merge(array, i, i + (size >> 1), i += size);
var chunk = merge(array, i, i + (size >> 1), i += size);
if (chunk.length > max) max = chunk.length;
if (chunk.length) chunks.push(chunk);
}
if (parallel) {
var pass = null;
for (var i = 0; i < max; i++) {
pass = chunks.map(function(c, j) { return c[i] || pass[j]; });
passes.push(Array.prototype.concat.apply([], pass));
}
} else {
passes = passes.concat(Array.prototype.concat.apply([], chunks));
}
}
merge(array, 0, size >> 1, array.length);
passes = passes.concat(merge(array, 0, size >> 1, array.length));
// Merges two adjacent sorted arrays in-place.
function merge(array, start, middle, end) {
var passes = [],
start0 = start;
for (; start < middle; start++) {
if (array[start] > array[middle]) {
var v = array[start];
array[start] = array[middle];
insert(array, middle, end, v);
passes.push(array.slice());
passes.push(parallel ? array.slice(start0, end) : array.slice());
}
}
return passes;
}
// Inserts the value v into the subarray specified by start and end.