Skip to content

Commit

Permalink
Implementing Quick Sort. Closes #2
Browse files Browse the repository at this point in the history
  • Loading branch information
lucasfcosta committed Aug 23, 2015
1 parent 2d83991 commit d09b00e
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 0 deletions.
97 changes: 97 additions & 0 deletions lib/sorter.js
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,103 @@ var Sorter = function(array) {
return _elements;
}
};

function _partitionArray(left, right) {
var pivot = _elements[Math.floor((right + left) / 2)];
var i = left;
var j = right;

while (i <= j) {
while (_elements[i] < pivot) {
i++;
}

while (_elements[j] > pivot) {
j--;
}

if (i <= j) {
var tmp = _elements[i];
_elements[i] = _elements[j];
_elements[j] = tmp;
i++;
j--;
}
}

return i;
}

function _quickSortArray(left, right) {
var index;

if (_elements.length > 1) {
index = _partitionArray(left, right);

if (left < index - 1) {
_quickSortArray(left, index - 1);
}

if (index < right) {
_quickSortArray(index, right);
}
}

return _elements;
}

function _partition(left, right) {
var pivot = _elements[Math.floor((right + left) / 2)][1];
var i = left;
var j = right;

while (i <= j) {
while (_elements[i][1] < pivot) {
i++;
}

while (_elements[j][1] > pivot) {
j--;
}

if (i <= j) {
var tmp = _elements[i];
_elements[i] = _elements[j];
_elements[j] = tmp;
i++;
j--;
}
}

return i;
}

function _quickSort(left, right) {
var index;

if (_elements.length > 1) {
index = _partition(left, right);

if (left < index - 1) {
_quickSort(left, index - 1);
}

if (index < right) {
_quickSort(index, right);
}
}

return _elements;
}

this.quickSort = function() {
if (_simpleArray) {
return _quickSortArray(0, _elements.length - 1);
} else {
_elements = _clearObjectArray(_quickSort(0, _elements.length - 1));
return _elements;
}
};

};

Expand Down
45 changes: 45 additions & 0 deletions test/sorting.js
Original file line number Diff line number Diff line change
Expand Up @@ -259,3 +259,48 @@ describe('Heap Sort', function () {
assert.equal(sorter.getElements()[2], objectArray[0]);
});
});

describe('Quick Sort', function () {
it('Should sort the simple array correctly', function () {
var sorter = new Sorter(aSimpleArray);

assert.equal(sorter.quickSort().length, 6);

for (var i = 0; i < sorter.getElements().length; i++) {
assert.equal(sorter.getElements()[i], aSimpleArraySorted[i]);
}
});

it('Should sort the object array by the selected property path', function () {
var sorter = new Sorter(objectArray);

assert.equal(sorter.sortBy('.age').quickSort().length, 3);
assert.equal(sorter.getElements()[0], objectArray[1]);
assert.equal(sorter.getElements()[1], objectArray[0]);
assert.equal(sorter.getElements()[2], objectArray[2]);

assert.equal(sorter.sortBy('.userId').quickSort().length, 3);
assert.equal(sorter.getElements()[0], objectArray[2]);
assert.equal(sorter.getElements()[1], objectArray[0]);
assert.equal(sorter.getElements()[2], objectArray[1]);

assert.equal(sorter.sortBy('.height').quickSort().length, 3);
assert.equal(sorter.getElements()[0], objectArray[0]);
assert.equal(sorter.getElements()[1], objectArray[2]);
assert.equal(sorter.getElements()[2], objectArray[1]);

assert.equal(sorter.sortBy('.yearsUntilGraduation').quickSort().length, 3);
assert.equal(sorter.getElements()[0], objectArray[2]);
assert.equal(sorter.getElements()[1], objectArray[0]);
assert.equal(sorter.getElements()[2], objectArray[1]);
});

it('Should sort nested properties', function () {
var sorter = new Sorter(objectArray);

assert.equal(sorter.sortBy('.family.numberOfChildren').quickSort().length, 3);
assert.equal(sorter.getElements()[0], objectArray[1]);
assert.equal(sorter.getElements()[1], objectArray[2]);
assert.equal(sorter.getElements()[2], objectArray[0]);
});
});

0 comments on commit d09b00e

Please sign in to comment.