Problem
Given an array containing only 0s, 1s and 2s. Write an efficient algorithm to sort the array.
Sample Input
[2, 0, 1, 1]
Sample Output
[0, 1, 1, 2]
Brute Force
You can directly use any sorting algorithm to do this task. This will take O(NLogN) time and at least O(N) auxiliary space. Can we find a better approach?
Efficient approach
This problem can be solved using a 3 pointer approach. Let’s see how! There are three pointers:
start
,
idx
and
finish
.
start
stores the first index that is not 0,
finish
stores the last index that is not 2 and
idx
will go from
start
to
finish
. If the element is 0, replace it with the element at index
start
and update
start
=
start
+ 1
and
idx
=
idx
+ 1
. If the element is 1, then
idx
=
idx
+ 1
should be updated. If the element is 2, swap it with the element at index
finish
and update
finish
=
finish
– 1
. The time complexity of this approach is O(N) with O(1) auxiliary space.
C++ Programming
#include<bits/stdc++.h>
using namespace std;
void sortArray(vector<int>& nums) {
int n=nums.size();
if(n==1) return;
int start=0;
int finish=n-1;
while(start<n && nums[start]==0){
start++;
}
while(finish>=0 && nums[finish]==2){
finish--;
}
int idx=start;
while(idx<=finish){
if(nums[idx]==0){
swap(nums[start],nums[idx]);
start++;
idx++;
}
else if(nums[idx]==2){
swap(nums[finish],nums[idx]);
finish--;
}
else idx++;
}
}
int main(){
vector<int> nums{1, 1, 0, 2};
sortArray(nums);
for(auto itr: nums) cout << itr<<" ";
}
C Programming
#include<stdio.h>
void sortArray(int nums[], int numsSize){
int finish = numsSize -1;
int start = 0;
int idx = 0;
while (idx <= finish)
{
if (nums[idx] == 0)
{
int save = nums[start];
nums[start] = nums[idx];
nums[idx] = save;
idx++; start++;
}
else if (nums[idx] == 1)
{
idx++;
}
else
{
int temp = nums[finish];
nums[finish] = nums[idx];
nums[idx] = temp;
finish--;
}
}
}
void main(){
int nums[4] = {1, 1, 0, 2};
sortArray(nums, 4);
for(int i=0; i<4; i++) printf("%d ",nums[i]);
}
Python Programming
def sortArray(a):
idx = 0
start = 0
finish = len(a) - 1
while idx <= finish:
if a[idx] == 0:
a[idx], a[start] = a[start], a[idx]
idx += 1
start += 1
elif a[idx] == 1:
idx += 1
else:
a[idx], a[finish] = a[finish], a[idx]
finish -= 1
return a
l = [1, 1, 0, 2]
print(sortArray(l))
Output
[0, 1, 1, 2]
People are also reading:
- Merge Two Sorted Arrays in-place
- Subarray with Sum k
- Find Maximum Subarray Sum
- Longest subarray with sum as K
- Majority Element
- Find whether an array is subset of another array
- Rod Cutting Problem – Dynamic Programming
- Print a given matrix in spiral form
- Find Maximum Length Subarray Having an Equal Number of 0’s and 1’s
- Check for pairs in an array with a particular sum
Leave a Comment on this Post