How to segregate 0s and 1s in C++
Suppose we’re working on a project that deals with binary data where 0 represents one state and 1 represents another. For example, in computer science, 0s and 1s usually represent off/on, false/true, or similar binary states.
Consider another scenario where we have an array of binary numbers. We need to organize them in a way that all the 0s come before the 1s. This situation can arise when processing binary data in various applications, such as image processing, sorting binary data, signal processing, and data compression.
Let's come to the implementation of segregating 0s and 1s in C++.
Implementation of segregating 0s and 1s
Let’s examine these approaches to determine the best one based on time and space complexity.
Naive approach
To solve the segregate 0s and 1s problem, we can use two separate arrays. We can iterate through the input array and maintain two separate arrays, one for 0s and the other for 1s. After iterating through the input array, we can concatenate the two arrays to get the segregated array. However, this approach requires extra space for the two arrays, which is not optimal. Therefore, we prefer to use an optimized approach to save extra space.
Optimized approach using two pointers
To solve this problem, we use an array and two pointers, left and right. The left pointer traverses from the start toward the end until it points to 1. The right pointer moves from the end toward the start until it points to 0. Swapping is performed in each iteration based on whether the left side has a 0 and the right side has a 1.
Let’s examine the complete process of segregating 0s and 1s below:
Let’s proceed with the implementation process below:
Sample input
[0, 1, 0, 1, 1, 0, 0, 1]
Sample output
[0, 0, 0, 0, 1, 1, 1, 1]
Code example
Let’s implement the code below:
#include <iostream>using namespace std;void segregateZerosAndOnes(int arr[], int size) {int l = 0;int r = size - 1;while (l < r) {// Increment l pointer while there are 0s at the beginningwhile (arr[l] == 0)l++;// Decrement right pointer while there are 1s at the endwhile (arr[r] == 1)r--;// Swap 0 at the left pointer with 1 at the right pointerif (l < r) {swap(arr[l], arr[r]);l++;r--;}}}int main() {int arr[] = {0, 1, 0, 1, 1, 0, 0, 1};int size = sizeof(arr) / sizeof(arr[0]);segregateZerosAndOnes(arr, size);cout << "Segregated Array: ";for (int i = 0; i < size; i++)cout << arr[i] << " ";return 0;}
Code explanation
Here’s the explanation of the above code.
Lines 5–6: Set
lto the start of the array andrto the end of the array.Line 8:
whileloop will continue until thelis less than ther.Lines 10–11: Move the
lpointer to the right until it points to a 1 (skipping 0s).Lines 14–15: Move the
rpointer to the left until it points to a 0 (skipping 1s)Lines 18–22: If
lis still less thanr, swap the values at thelandrpointers. This puts a 0 on the left side and a 1 on the right side.
Line 27:
arrayis initialized with 0s and 1s.Line 30: Call the function
segregateZerosAndOnes()and pass the arrayarrto rearrange 0s and 1s.Lines 33–34: Print the segregated array
arron the console.
Time complexity
The algorithm iterates through the array once with two pointers, l and r, performing constant-time operations at each step, resulting in a time complexity of
Space complexity
The algorithm uses only a constant amount of extra space for both pointers, leading to a space complexity of
Ready to master C++?
Our Learn C++ course will help you build practical skills, from basic loops to complex program structures. Join now and start coding your way to success!
Free Resources