diff --git a/src/sorting/heapsort.js b/src/sorting/heapsort.js index 765adc3a..e68cd0ab 100644 --- a/src/sorting/heapsort.js +++ b/src/sorting/heapsort.js @@ -17,7 +17,7 @@ * @param {Number} heapSize Size of the heap. * @param {function} cmp Comparison function. */ - function heapify(array, index, heapSize, cmp) { + function heapify(array, index, heapSize, cmp, debug) { var left = 2 * index + 1; var right = 2 * index + 2; var largest = index; @@ -31,9 +31,14 @@ } if (largest !== index) { + // DEBUG + if (debug) + console.log('Swapping ' + array[largest] + ' and ' + array[index]); var temp = array[index]; array[index] = array[largest]; array[largest] = temp; + //if(debug) + // console.log('Calling heapify recursively'); heapify(array, largest, heapSize, cmp); } } @@ -46,8 +51,10 @@ * @param {function} cmp Comparison function. * @return {Array} array Array turned into max heap. */ - function buildMaxHeap(array, cmp) { + function buildMaxHeap(array, cmp, debug) { for (var i = Math.floor(array.length / 2); i >= 0; i -= 1) { + if (debug) + console.log('Calling heapify from for loop'); heapify(array, i, array.length, cmp); } return array; @@ -72,17 +79,23 @@ * zero, or positive value, depending on the arguments. * @return {Array} Sorted array. */ - return function (array, cmp) { + return function (array, cmp, debug) { cmp = cmp || comparator; + debug = debug || false; + if (debug) + console.log('Swaps during initial heap construction:'); var size = array.length; var temp; - buildMaxHeap(array, cmp); + buildMaxHeap(array, cmp, debug); + + if (debug) + console.log('Heap is built; calls below are adjusting:'); for (var i = array.length - 1; i > 0; i -= 1) { temp = array[0]; array[0] = array[i]; array[i] = temp; size -= 1; - heapify(array, 0, size, cmp); + heapify(array, 0, size, cmp, debug); } return array; }; diff --git a/testHeap.js b/testHeap.js new file mode 100644 index 00000000..fd68579d --- /dev/null +++ b/testHeap.js @@ -0,0 +1,27 @@ + function dispArr(arr) { + for (var i = 0; i < arr.length; ++i) { + process.stdout.write(arr[i] + " "); + if (i % 10 == 9) { + process.stdout.write("\n"); + } + } + if (i % 10 != 0) { + process.stdout.write("\n"); + } + } + +var MAX = 50 +var sort = require('./src/sorting/heapsort.js').heapSort; +var values = []; +for (var i = 0; i < MAX; ++i) { + values[i] = Math.floor(Math.random() * MAX+1); + } + +//values = [19,4,38,26,14,73,3,83,42,6]; + +console.log('\nBefore: '); +dispArr(values); + +console.log('\nAfter: '); +dispArr(sort(values)); +