Skip to content

Instantly share code, notes, and snippets.

@marcmartino
Created December 23, 2013 20:25
Show Gist options
  • Save marcmartino/8104015 to your computer and use it in GitHub Desktop.
Save marcmartino/8104015 to your computer and use it in GitHub Desktop.
Write a function that takes two sorted lists of numbers and merges them into a single sorted list.
var assert = require('assert');
function sortMerged(lOne, lTwo) {
return lOne.reduce(function (sortedList, num, index) {
var position = findPositionBinary(sortedList, num);
sortedList.splice(position, 0, num);
return sortedList;
}, lTwo);
}
/*function findPosition(sList, num) { //linear search time
var m = 0;
for (m; m < sList.length; m++) {
if (sList[m] >= num) {
return m;
}
};
return m;
}*/
//optimization
function findPositionBinary(sList, num, offset) {
var middle = Math.floor(sList.length / 2),
middleVal = sList[middle],
ending = sList.length === 1;
offset = offset || 0;
if (middleVal > num) {
if (ending || middle - 1 === -1) {
return middle + offset;
}
return findPositionBinary(sList.slice(0, middle), num) + offset;
} else if (middleVal < num) {
if (ending || middle + 1 === sList.length ) {
return middle + 1 + offset;
}
return findPositionBinary(sList.slice(middle, sList.length), num, middle) + offset;
} else {
return middle + offset;
}
}
var testArray = [1, 2, 3, 4, 5, 6, 7,8 , 9];
assert.equal(findPositionBinary(testArray, 0), 0);
assert.equal(findPositionBinary(testArray, 5), 4);
assert.equal(findPositionBinary(testArray, 8), 7);
assert.equal(findPositionBinary(testArray, 1.5), 1);
assert.equal(findPositionBinary(testArray, 2.5), 2);
assert.equal(findPositionBinary(testArray, 3.5), 3);
assert.equal(findPositionBinary(testArray, 6.5), 6);
assert.equal(findPositionBinary(testArray, 9.5), 9);
console.log(sortMerged([0, 0.3, 2, 100], [1, 4, 5]));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment