diff --git a/index.html b/index.html
index 075835e..667dc79 100644
--- a/index.html
+++ b/index.html
@@ -115,7 +115,7 @@
console.log('SHUFFLED: ' + b.join(','));
var ordered = Object.create(shuffled);
- MS.sort(ordered, 0, ordered.length - 1);
+ var ordered = MS.sort(ordered, 0, ordered.length - 1);
var c = []
ordered.forEach(function(obj0) {
c.push(obj0.value);
diff --git a/js/mergesort.js b/js/mergesort.js
index 83e2d6c..9c98aef 100644
--- a/js/mergesort.js
+++ b/js/mergesort.js
@@ -25,29 +25,54 @@ Mergesort.prototype.addInstruction = function(operation, left, right, mid) {
});
};
-var count = 0;
+var dump = function(arr) {
+ var d = [];
+ arr.forEach(function(obj) {
+ d.push(obj.value);
+ })
+
+ return d.join(',');
+}
/**
*
*/
Mergesort.prototype.sort = function(arr, start, end) {
- count++;
-
- if (count > 30) {
- console.error('count exceeded');
- return;
- }
-
- if (start >= end) {
- this.addInstruction('single', start, end, null);
- return;
+ if (start === end) {
+ this.addInstruction('single', start);
+ return new Array(arr[start]);
}
var mid = start + Math.floor((end - start) / 2);
- // this.addInstruction('init', start, end, mid);
+ var arr1 = this.sort(arr, start, mid);
+ var arr2 = this.sort(arr, mid + 1, end);
+
+ var result = this.merge(arr1, arr2);
+
+ return result;
+};
+
+/**
+ *
+ */
+Mergesort.prototype.merge = function(arr1, arr2) {
+ var result = [];
+
+ while (arr1.length > 0 || arr2.length > 0) {
+ if (arr1.length === 0) {
+ result.push(arr2.shift());
+ }
+ else if (arr2.length === 0) {
+ result.push(arr1.shift());
+ }
+ else if (arr1[0].value <= arr2[0].value) {
+ result.push(arr1.shift());
+ }
+ else {
+ result.push(arr2.shift());
+ }
+ }
- this.sort(arr, start, mid);
- this.sort(arr, mid + 1, end);
- return;
+ return result;
};