Move all Zeros to End of Array (original) (raw)

Last Updated : 26 Feb, 2026

Given an array of integers **arr[], move all the **zeros to the **end of the array while maintaining the relative order of all **non-zero elements.

**Examples:

**Input: arr[] = [1, 2, 0, 4, 3, 0, 5, 0]
**Output: [1, 2, 4, 3, 5, 0, 0, 0]
**Explanation: There are three 0s that are moved to the end.

**Input: arr[] = [10, 20, 30]
**Output: [10, 20, 30]
**Explanation: No change in array as there are no 0s.

**Input: arr[] = [0, 0]
**Output: [0, 0]
**Explanation: No change in array as there are all 0s.

Try It Yourselfredirect icon

Table of Content

[Naive Approach] Using Temporary Array - O(n) Time and O(n) Space

The idea is to use a temporary array of the same size, copy all non-zero elements into it, fill the remaining positions with zeros, and then copy the temporary array back to the original array.

**Working:

C++ `

#include #include

using namespace std;

void pushZerosToEnd(vector &arr) { int n = arr.size(); vector temp(n);

// to keep track of the index in temp[]
int j = 0;

// Copy non-zero elements to temp[]
for (int i = 0; i < n; i++)
{
    if (arr[i] != 0)
        temp[j++] = arr[i];
}

// Fill remaining positions in temp[] with zeros
while (j < n)
{
    temp[j++] = 0;
}

// Copy all the elements from temp[] to arr[]
for (int i = 0; i < n; i++)
    arr[i] = temp[i];

}

int main() { vector arr = {1, 2, 0, 4, 3, 0, 5, 0}; pushZerosToEnd(arr);

for (int num : arr)
{
    cout << num << " ";
}
return 0;

}

C

#include <stdio.h>

void pushZerosToEnd(int *arr, int n) { int temp[n];

// to keep track of the index in temp[]
int j = 0;

// Copy non-zero elements to temp[]
for (int i = 0; i < n; i++)
{
    if (arr[i] != 0)
        temp[j++] = arr[i];
}

// Fill remaining positions in temp[] with zeros
while (j < n)
    temp[j++] = 0;

// Copy all the elements from temp[] to arr[]
for (int i = 0; i < n; i++)
    arr[i] = temp[i];

}

int main() { int arr[] = {1, 2, 0, 4, 3, 0, 5, 0}; int n = sizeof(arr) / sizeof(arr[0]);

pushZerosToEnd(arr, n);

for (int i = 0; i < n; i++)
{
    printf("%d ", arr[i]);
}
return 0;

}

Java

import java.util.Arrays; class GfG {

static void pushZerosToEnd(int[] arr) {
    int n = arr.length;
    int[] temp = new int[n];

    // to keep track of the index in temp[]
    int j = 0;

    // Copy non-zero elements to temp[]
    for (int i = 0; i < n; i++) {
        if (arr[i] != 0)
            temp[j++] = arr[i];
    }

    // Fill remaining positions in temp[] with zeros
    while (j < n)
        temp[j++] = 0;

    // Copy all the elements from temp[] to arr[]
    for (int i = 0; i < n; i++)
        arr[i] = temp[i];
}

public static void main(String[] args) {
    int[] arr = {1, 2, 0, 4, 3, 0, 5, 0};
    pushZerosToEnd(arr);

    for (int num : arr) {
        System.out.print(num + " ");
    }
}

}

Python

def pushZerosToEnd(arr): n = len(arr) temp = [0] * n

# to keep track of the index in temp[]
j = 0

# Copy non-zero elements to temp[]
for i in range(n):
    if arr[i] != 0:
        temp[j] = arr[i]
        j += 1

# Fill remaining positions in temp[] with zeros
while j < n:
    temp[j] = 0
    j += 1

# Copy all the elements from temp[] to arr[]
for i in range(n):
    arr[i] = temp[i]

if name == "main": arr = [1, 2, 0, 4, 3, 0, 5, 0] pushZerosToEnd(arr)

for num in arr:
    print(num, end=" ")

C#

using System; class GfG {

static void pushZerosToEnd(int[] arr)
{
    int n = arr.Length;
    int[] temp = new int[n];

    // to keep track of the index in temp[]
    int j = 0;

    // Copy non-zero elements to temp[]
    for (int i = 0; i < n; i++) {
        if (arr[i] != 0)
            temp[j++] = arr[i];
    }

    // Fill remaining positions in temp[] with zeros
    while (j < n)
        temp[j++] = 0;

    // Copy all the elements from temp[] to arr[]
    for (int i = 0; i < n; i++)
        arr[i] = temp[i];
}

static void Main(string[] args)
{
    int[] arr = { 1, 2, 0, 4, 3, 0, 5, 0 };
    pushZerosToEnd(arr);

    // Print the modified array
    foreach(int num in arr) Console.Write(num + " ");
}

}

JavaScript

function pushZerosToEnd(arr) { const n = arr.length; const temp = new Array(n);

// to keep track of the index in temp[]
let j = 0;

// Copy non-zero elements to temp[]
for (let i = 0; i < n; i++) {
    if (arr[i] !== 0) {
        temp[j++] = arr[i];
    }
}

// Fill remaining positions in temp[] with zeros
while (j < n)
    temp[j++] = 0;

// Copy all the elements from temp[] to arr[]
for (let i = 0; i < n; i++)
    arr[i] = temp[i];

}

// Driver Code const arr = [ 1, 2, 0, 4, 3, 0, 5, 0 ]; pushZerosToEnd(arr);

console.log(arr.join(" "));

`

[Better Approach] Two Traversals-O(n) Time and O(1) space

The idea is to move all the zeros to the end of the array while maintaining the relative order of non-zero elements using two traversals. Traverse the array once to move all non-zero elements to the front while maintaining order, then traverse the remaining positions and fill them with zeros.

**Working:

C++ `

#include #include using namespace std;

void pushZerosToEnd(vector &arr) {

int count = 0;

// If the element is non-zero, replace the element at
// index 'count' with this element and increment count
for (int i = 0; i < arr.size(); i++)
{
    if (arr[i] != 0)
        arr[count++] = arr[i];
}

// Now all non-zero elements have been shifted to
// the front. Make all elements 0 from count to end.
while (count < arr.size())
    arr[count++] = 0;

}

int main() { vector arr = {1, 2, 0, 4, 3, 0, 5, 0}; pushZerosToEnd(arr); for (int num : arr) { cout << num << " "; } return 0; }

C

#include <stdio.h>

void pushZerosToEnd(int *arr, int n) {

int count = 0;

// If the element is non-zero, replace the element at
// index 'count' with this element and increment count
for (int i = 0; i < n; i++)
{
    if (arr[i] != 0)
        arr[count++] = arr[i];
}

// Now all non-zero elements have been shifted to
// the front. Make all elements 0 from count to end.
while (count < n)
    arr[count++] = 0;

}

int main() { int arr[] = {1, 2, 0, 4, 3, 0, 5, 0}; int size = sizeof(arr) / sizeof(arr[0]); pushZerosToEnd(arr, size); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } return 0; }

Java

class GfG {

static void pushZerosToEnd(int[] arr)
{

    int count = 0;

    // If the element is non-zero, replace the element
    // at index 'count' with this element and increment
    // count
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] != 0)
            arr[count++] = arr[i];
    }

    // Now all non-zero elements have been shifted to
    // the front. Make all elements 0 from count to end.
    while (count < arr.length)
        arr[count++] = 0;
}

public static void main(String[] args)
{
    int[] arr = { 1, 2, 0, 4, 3, 0, 5, 0 };
    pushZerosToEnd(arr);
    for (int num : arr) {
        System.out.print(num + " ");
    }
}

}

Python

def pushZerosToEnd(arr):

count = 0

# If the element is non-zero, replace the element at
# index 'count' with this element and increment count
for i in range(len(arr)):
    if arr[i] != 0:
        arr[count] = arr[i]
        count += 1

# Now all non-zero elements have been shifted to
# the front. Make all elements 0 from count to end.
while count < len(arr):
    arr[count] = 0
    count += 1

if name == "main": arr = [1, 2, 0, 4, 3, 0, 5, 0] pushZerosToEnd(arr) for num in arr: print(num, end=" ")

C#

using System;

class GfG {

static void pushZerosToEnd(int[] arr)
{

    int count = 0;

    // If the element is non-zero, replace the element
    // at index 'count' with this element and increment
    // count
    for (int i = 0; i < arr.Length; i++) {
        if (arr[i] != 0)
            arr[count++] = arr[i];
    }

    // Now all non-zero elements have been shifted to
    // the front. Make all elements 0 from count to end.
    while (count < arr.Length)
        arr[count++] = 0;
}

static void Main()
{
    int[] arr = { 1, 2, 0, 4, 3, 0, 5, 0 };
    pushZerosToEnd(arr);
    foreach(int num in arr)
    {
        Console.Write(num + " ");
    }
}

}

JavaScript

function pushZerosToEnd(arr) {

let count = 0;

// If the element is non-zero, replace the element at
// index 'count' with this element and increment count
for (let i = 0; i < arr.length; i++) {
    if (arr[i] !== 0)
        arr[count++] = arr[i];
}

// Now all non-zero elements have been shifted to
// the front. Make all elements 0 from count to end.
while (count < arr.length)
    arr[count++] = 0;

}

// Driver Code const arr = [ 1, 2, 0, 4, 3, 0, 5, 0 ]; pushZerosToEnd(arr); console.log(arr.join(" "));

`

[Expected Approach] One Traversal-O(n) Time and O(1) space

The idea is similar to the previous approach where we took a pointer, say count to track where the next non-zero element should be placed. However, on encountering a non-zero element, instead of directly placing the non-zero element at arr[count], we will swap the non-zero element with arr[count]. This will ensure that if there is any zero present at arr[count], it is pushed towards the end of array and is not overwritten.

**Working:

C++ `

#include #include using namespace std;

void pushZerosToEnd(vector& arr) {

// Pointer to track the position 
// for next non-zero element
int count = 0;
 
for (int i = 0; i < arr.size(); i++) {

    // If the current element is non-zero
    if (arr[i] != 0) {
      
        // Swap the current element with 
        // the 0 at index 'count'
        swap(arr[i], arr[count]);
        // Move 'count' pointer to the 
        // next position
        count++;
    }
}

}

int main() { vector arr = {1, 2, 0, 4, 3, 0, 5, 0}; pushZerosToEnd(arr); for (int num : arr) { cout << num << " "; } return 0; }

C

#include <stdio.h>

void pushZerosToEnd(int arr[], int n) {

// Pointer to track the position 
// for next non-zero element
int count = 0;
 
for (int i = 0; i < n; i++) {

    // If the current element is non-zero
    if (arr[i] != 0) {
      
        // Swap the current element with 
        // the 0 at index 'count'
        int temp = arr[i];
        arr[i] = arr[count];
        arr[count] = temp;
      
        // Move 'count' pointer to 
        // the next position
        count++;
    }
}

}

int main() { int arr[] = {1, 2, 0, 4, 3, 0, 5, 0}; int size = sizeof(arr) / sizeof(arr[0]);

pushZerosToEnd(arr, size);

for (int i = 0; i < size; i++) {
    printf("%d ", arr[i]);
}

return 0;

}

Java

import java.util.Arrays;

class GfG {

static void pushZerosToEnd(int[] arr) {

    // Pointer to track the position 
    // for next non-zero element
    int count = 0;

    for (int i = 0; i < arr.length; i++) {

        // If the current element is non-zero
        if (arr[i] != 0) {

            // Swap the current element with
            // the 0 at index 'count'
            int temp = arr[i];
            arr[i] = arr[count];
            arr[count] = temp;

            // Move 'count' pointer to 
            // the next position
            count++;
        }
    }
}

public static void main(String[] args) {
    int[] arr = {1, 2, 0, 4, 3, 0, 5, 0};
    pushZerosToEnd(arr);
    for (int num : arr) {
        System.out.print(num + " ");
    }
}

}

Python

def pushZerosToEnd(arr):

# Pointer to track the position
# for next non-zero element
count = 0

for i in range(len(arr)):
    
    # If the current element is non-zero
    if arr[i] != 0:
        
        # Swap the current element with
        # the 0 at index 'count'
        arr[i], arr[count] = arr[count], arr[i]
        
        # Move 'count' pointer to the next position
        count += 1

if name == "main": arr = [1, 2, 0, 4, 3, 0, 5, 0] pushZerosToEnd(arr) for num in arr: print(num, end=" ")

C#

using System;

class GfG {

static void pushZerosToEnd(int[] arr) {
    
    // Pointer to track the position
    // for next non-zero element
    int count = 0;

    for (int i = 0; i < arr.Length; i++) {
        
        // If the current element is non-zero
        if (arr[i] != 0) {
          
            // Swap the current element with
            // the 0 at index 'count'
            int temp = arr[i];
            arr[i] = arr[count];
            arr[count] = temp;

            // Move 'count' pointer to 
            // the next position
            count++;
        }
    }
}

static void Main() {
    int[] arr = { 1, 2, 0, 4, 3, 0, 5, 0 };
    pushZerosToEnd(arr);
    foreach (int num in arr) {
        Console.Write(num + " ");
    }
}

}

JavaScript

function pushZerosToEnd(arr) {

// Pointer to track the position
// for next non-zero element
let count = 0;

for (let i = 0; i < arr.length; i++) {
    
    // If the current element is non-zero
    if (arr[i] !== 0) {
        
        // Swap the current element
        // with the 0 at index 'count'
        [arr[i], arr[count]] = [arr[count], arr[i]];
        
        // Move 'count' pointer to the next position
        count++;
    }
}

}

// Driver code const arr = [1, 2, 0, 4, 3, 0, 5, 0]; pushZerosToEnd(arr); console.log(arr.join(" "));

`