- Published on
 
Sort an array of 0s, 1s and 2s.
Yay! It's the second day of my coding diary.
Problem of the day - Sort an array of 0s, 1s and 2s
Tag - Easy
So, the problem is, an array containing numbers 0,1, or 2 is given and I need to sort the array.
The catch here is, I can't use any in-build sorting algorithm here. I need to keep the time complexity o(n).
Initially, the problem seemed pretty complex but after some drilling, a simple approach came into my mind. As I only have 0,1 or 2 so why not store their counts and then just push values as per the count to new array.
Suppose, 0 came twice, 1 came thrice & 2 came once. So, I will just push values as per count. My final output would look like this - [0,0,1,1,1,2]
Code
#include <iostream>#include<vector>using namespace std;
int main(){    vector<int> list = {0,1,2,2,1,1};
    vector<int> count = {0,0,0};
    for(auto val: list) {        count[val]++;    }    vector<int> res;
    int curr_index      = 0;    int output_index    = 0;
    while(curr_index < count.size()) {        if(count[curr_index] == 0) {            curr_index++;        } else {            res.push_back(curr_index);            count[curr_index] -= 1;        }    }    for(auto val: list) {        cout << val << " ";    }    return 0;}Time complexity - o(n)
Space Complexity - o(n)
Umm, It seems I am unnecessary keeping an extra array. Can I do it without using extra space (variables are not counted as extra space) ?
As I have calculated the count, I don't care what were the values in the original array so I can just update the same array, in place.
My modified code looks like this -
#include <iostream>#include<vector>using namespace std;
int main(){    vector<int> list = {0,1,2,2,1,1};
    vector<int> count = {0,0,0};
    for(auto val: list) {        count[val]++;    }
    int curr_index      = 0;    int output_index    = 0;
    while(curr_index < count.size()) {        if(count[curr_index] == 0) {            curr_index++;        } else {            list[output_index] = curr_index;            output_index++;            count[curr_index] -= 1;        }    }    for(auto val: list) {        cout << val << " ";    }    return 0;}
Time complexity - o(n)
Space Complexity - o(1)
You might like previous editions of my coding diary -