Skip to content

Commit

Permalink
optimized mergesort with arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
manuelkiessling committed Apr 11, 2012
1 parent 06910a7 commit 52e07cc
Show file tree
Hide file tree
Showing 4 changed files with 165 additions and 0 deletions.
61 changes: 61 additions & 0 deletions lib/algorithm/mergesortArray.js
@@ -0,0 +1,61 @@
"use strict";
if (typeof define !== 'function') { var define = require('amdefine')(module) }

define([], function() {

var split = function(list) {
var halfsize = Math.floor(list.length / 2);
var left = list.splice(0, halfsize);
var right = list;
return {
left: left,
right: right
}
};

var merge = function(left, right, compare) {
var merged = [];
var leftLength = left.length;
var rightLength = right.length;
var leftIndex = 0;
var rightIndex = 0;
while (leftIndex < leftLength && rightIndex < rightLength) {
if (compare(left[leftIndex], right[rightIndex]) <= 0) { // item in left is smaller or equal
merged.push(left[leftIndex]);
leftIndex++;
} else {
merged.push(right[rightIndex]);
rightIndex++;
}
}

while (leftIndex < leftLength) {
merged.push(left[leftIndex]);
leftIndex++;
}

while (rightIndex < rightLength) {
merged.push(right[rightIndex]);
rightIndex++;
}

return merged;
};

var mergesort = function(list, compare) {
if (list.length <= 1) {
return list;
} else {
var sublists = split(list);
var sublistleft = sublists.left;
var sublistright = sublists.right;

var left = mergesort(sublistleft, compare);
var right = mergesort(sublistright, compare);

return merge(left, right, compare);
}
};

return mergesort;
});
40 changes: 40 additions & 0 deletions performance/lib/algorithm/mergesortArray.perf.html
@@ -0,0 +1,40 @@
<!DOCTYPE html>
<html>
<head>
<title>Performance/Memory test page for mergesortArray.js</title>
<script type="text/javascript" src="../../../vendor/require-1.0.7/require.js"></script>
</head>

<body>
<script type="text/javascript">
require.config({
baseUrl: './'
});

require(['../../../lib/algorithm/mergesortArray.js'], function(mergesort) {
var compareNumbers = function(a, b) {
if (a < b) {
return -1;
}
if (a === b) {
return 0;
}
if (a > b) {
return 1;
}
};

var items = [];
for (var i = 0; i < 1000000; i++) {
items.push(Math.floor(Math.random() * 1000000));
}

var start = new Date().getTime();
var sorted = mergesort(items, compareNumbers);
var end = new Date().getTime();
var time = end - start;
window.alert(time);
});
</script>
</body>
</html>
39 changes: 39 additions & 0 deletions performance/lib/algorithm/mergesortArray.perf.js
@@ -0,0 +1,39 @@
"use strict";
if (typeof define !== 'function') { var define = require('amdefine')(module) }

var compareNumbers = function(a, b) {
if (a < b) {
return -1;
}
if (a === b) {
return 0;
}
if (a > b) {
return 1;
}
};

define(["../../../lib/datastructure/Queue", "../../../lib/algorithm/mergesortArray"], function(Queue, mergesort) {
var compareNumbers = function(a, b) {
if (a < b) {
return -1;
}
if (a === b) {
return 0;
}
if (a > b) {
return 1;
}
};

var items = [];
for (var i = 0; i < 10000000; i++) {
items.push(Math.floor(Math.random() * 10000000));
}

var start = new Date().getTime();
var sorted = mergesort(items, compareNumbers);
var end = new Date().getTime();
var time = end - start;
console.log(time);
});
25 changes: 25 additions & 0 deletions spec/algorithm/mergesortArray.spec.js
@@ -0,0 +1,25 @@
"use strict";
if (typeof define !== 'function') { var define = require('amdefine')(module) }

var compareNumbers = function(a, b) {
if (a < b) {
return -1;
}
if (a === b) {
return 0;
}
if (a > b) {
return 1;
}
};

define(["../../lib/algorithm/mergesortArray"], function(mergesort) {
describe("mergesort", function() {
it("correctly sorts", function() {
var unsorted = [4, 9, 7, 8, 1, 9];

var sorted = mergesort(unsorted, compareNumbers);
expect(sorted.join("")).toEqual("147899");
});
});
});

0 comments on commit 52e07cc

Please sign in to comment.