Skip to content

Commit

Permalink
Refactor Radix sort
Browse files Browse the repository at this point in the history
  • Loading branch information
felipernb committed Aug 3, 2014
1 parent 4b0499f commit ca45965
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 65 deletions.
56 changes: 8 additions & 48 deletions algorithms/sorting/radix_sort.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
*/
var radixSort = function (array) {
var max = maximumKey(array);
var digitsMax = amountOfDigits(max);
var digitsMax = (max === 0 ? 1 :
1 + Math.floor(Math.log(max) / Math.log(10))); // log base 10

for (var i = 0; i < digitsMax; i++) {
array = auxiliaryCountingSort(array, i);
Expand Down Expand Up @@ -71,55 +72,14 @@ var auxiliaryCountingSort = function (array, mod) {
* @return Integer if array non-empty
* Undefined otherwise
*/
var maximumKey = function (array) {
var length = array.length;

if (length > 0) {
var max = array[0].key;

for (var i = 1; i < length; i++) {
if (array[i].key > max) {
max = array[i].key;
}
}

return max;
}
else {
return undefined;
}
};

/**
* Returns the amount of digits contained in a number
*
* Asymptotic Complexity: O(d), where 'd' represents the
* amount of digits in the number
*
* @param Number
* @return Number
*/
var amountOfDigits = function (number) {
if (number === 0) {
return 1;
}
else {
var counter = 0;

// For positive numbers
while (parseInt(number) > 0) {
number /= 10;
++counter;
}

// For negative numbers
while (parseInt(number) < 0) {
number /= 10;
++counter;
var maximumKey = function (a) {
var max;
for (var i = 1; i < a.length; i++) {
if (max === undefined || a[i].key > max) {
max = a[i].key;
}

return counter;
}
return max;
};

module.exports = radixSort;
42 changes: 25 additions & 17 deletions test/algorithms/sorting/radix_sort.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,34 @@ var fourthObject = {
anotherProperty: '!'
};

var array = [
thirdObject,
fourthObject,
firstObject,
secondObject,
secondObject,
firstObject,
firstObject,
fourthObject
];

describe('Radix Sort', function () {
it('should sort the given array', function () {
array = radixSort(array);
var sorted = radixSort([
thirdObject,
fourthObject,
firstObject,
secondObject,
secondObject,
firstObject,
firstObject,
fourthObject
]);

// Asserts that the array is truly sorted
assert.deepEqual(array.indexOf(thirdObject), 0);
assert.deepEqual(array.indexOf(fourthObject), 1);
assert.deepEqual(array.indexOf(firstObject), 3);
assert.deepEqual(array.indexOf(secondObject), 6);
assert.deepEqual(array.indexOf({key: 99}), -1);
assert.deepEqual(sorted, [
thirdObject,
fourthObject,
fourthObject,
firstObject,
firstObject,
firstObject,
secondObject,
secondObject
]);

assert.deepEqual(radixSort([thirdObject, thirdObject]), [
thirdObject,
thirdObject
]);
});
});

0 comments on commit ca45965

Please sign in to comment.