One of the basic questions which are generally asked in technical interviews is to sort a given array which contains only 0 and 1 as elements without using another array and having a time complexity of O(n)
Example -
Input: [1, 0, 1, 0, 1, 0, 1, 0]
Output: [0, 0, 0, 0, 1, 1, 1, 1]
After reading O(n) the first thing that would come to mind is quick sort but having a binary array as an input makes the problem simpler for us. Let me share 2 methods to do it. But wouldn't you like to think of a pseudo-code before checking the solutions below?
Method 1 -
We count the number of zeros and ones in the array and then repopulate the array based on the count.
const sortBinaryArr = (arr) => { let zerosCount = 0; let arrLen = arr.length; // Iterate over the array once to get the count of the number of zeros preset for (let index = 0; index < arrLen; index++) { if (arr[index] === 0) { ++zerosCount; } } // Iterate over the array till the number of zeros we got above and set all array elements up to this index to zero for (let index = 0; index < zerosCount; index++) { arr[index] = 0; } // Iterate over the remaining items and set them to one for (let index = zerosCount; index < arrLen; index++) { arr[index] = 1; } return arr; };
Technically we are iterating over the array twice hence these operations combined are O(2n). Therefore the function sortBinaryArr() is an O(2 * n) operation, which is equivalent to O(n).
Method 2 -
A more optimized method is as below.
const sortBinaryArr = (arr) => { let pointer = -1; const arrLen = arr.length; for (let index = 0; index < arrLen; index++) { // if the number is smaller than 1 then swap it with the number at the pointer index if (arr[index] < 1) { pointer++; const temp = arr[pointer]; arr[pointer] = arr[index]; arr[index] = temp; } } return arr; };
The algorithm is pretty simple and self-explanatory. Here, we make use of a variable which acts as a pointer and helps us to keep track of zeros and ones while we iterate over the array.
Such that,
- If the element is 0 then we increment the pointer by 1 and swap the current element with the element at the pointer position.
- If the element is 1 we continue without any action.
Can you think of a better solution? Comment down your solution...
Top comments (0)