Minimum adjacent swaps required to Sort Binary array - GeeksforGeeks

16 Aug, 2021
Given a binary array, task is to sort this binary array using minimum swaps. We are allowed to swap only adjacent elements
Examples: 
Input : [0, 0, 1, 0, 1, 0, 1, 1]
Output : 3
1st swap : [0, 0, 1, 0, 0, 1, 1, 1]
2nd swap : [0, 0, 0, 1, 0, 1, 1, 1]
3rd swap : [0, 0, 0, 0, 1, 1, 1, 1]

Input : Array = [0, 1, 0, 1, 0]
Output : 3
Approach : This can be done by finding number of zeroes to the right side of every 1 and add them. In order to sort the array every one always has to perform a swap operation with every zero on its right side. So the total number of swap operations for a particular 1 in array is the number of zeroes on its right hand side. Find the number of zeroes on right side for every one i.e. the number of swaps and add them all to obtain the total number of swaps.
Implementation : 
C++
Java
Python3
C#
PHP
Javascript
// C++ code to find minimum number of// swaps to sort a binary array#include <bits/stdc++.h> using namespace std; // Function to find minimum swaps to// sort an array of 0s and 1s.int findMinSwaps(int arr[], int n){    // Array to store count of zeroes    int noOfZeroes[n];    memset(noOfZeroes, 0, sizeof(noOfZeroes));     int i, count = 0;     // Count number of zeroes    // on right side of every one.    noOfZeroes[n - 1] = 1 - arr[n - 1];    for (i = n - 2; i >= 0; i--) {        noOfZeroes[i] = noOfZeroes[i + 1];        if (arr[i] == 0)            noOfZeroes[i]++;    }     // Count total number of swaps by adding number    // of zeroes on right side of every one.    for (i = 0; i < n; i++) {        if (arr[i] == 1)            count += noOfZeroes[i];    }     return count;} // Driver codeint main(){    int arr[] = { 0, 0, 1, 0, 1, 0, 1, 1 };    int n = sizeof(arr) / sizeof(arr[0]);    cout << findMinSwaps(arr, n);    return 0;}
// Java code to find minimum number of// swaps to sort a binary arrayclass gfg {         static int findMinSwaps(int arr[], int n)    {        // Array to store count of zeroes        int noOfZeroes[] = new int[n];        int i, count = 0;         // Count number of zeroes        // on right side of every one.        noOfZeroes[n - 1] = 1 - arr[n - 1];        for (i = n - 2; i >= 0; i--)        {            noOfZeroes[i] = noOfZeroes[i + 1];            if (arr[i] == 0)                noOfZeroes[i]++;        }         // Count total number of swaps by adding number        // of zeroes on right side of every one.        for (i = 0; i < n; i++)        {            if (arr[i] == 1)                count += noOfZeroes[i];        }        return count;    }         // Driver Code    public static void main(String args[])    {        int ar[] = { 0, 0, 1, 0, 1, 0, 1, 1 };        System.out.println(findMinSwaps(ar, ar.length));    }} // This code is contributed by Niraj_Pandey.
# Python3 code to find minimum number of# swaps to sort a binary array # Function to find minimum swaps to# sort an array of 0s and 1s.def findMinSwaps(arr, n) :    # Array to store count of zeroes    noOfZeroes = [0] * n    count = 0         # Count number of zeroes    # on right side of every one.    noOfZeroes[n - 1] = 1 - arr[n - 1]    for i in range(n-2, -1, -1) :        noOfZeroes[i] = noOfZeroes[i + 1]        if (arr[i] == 0) :            noOfZeroes[i] = noOfZeroes[i] + 1     # Count total number of swaps by adding    # number of zeroes on right side of    # every one.    for i in range(0, n) :        if (arr[i] == 1) :            count = count + noOfZeroes[i]     return count # Driver codearr = [ 0, 0, 1, 0, 1, 0, 1, 1 ]n = len(arr)print (findMinSwaps(arr, n)) # This code is contributed by Manish Shaw# (manishshaw1)
// C# code to find minimum number of// swaps to sort a binary arrayusing System; class GFG {         static int findMinSwaps(int []arr, int n)    {                 // Array to store count of zeroes        int []noOfZeroes = new int[n];        int i, count = 0;         // Count number of zeroes        // on right side of every one.        noOfZeroes[n - 1] = 1 - arr[n - 1];        for (i = n - 2; i >= 0; i--)        {            noOfZeroes[i] = noOfZeroes[i + 1];            if (arr[i] == 0)                noOfZeroes[i]++;        }         // Count total number of swaps by        // adding number of zeroes on right        // side of every one.        for (i = 0; i < n; i++)        {            if (arr[i] == 1)                count += noOfZeroes[i];        }                 return count;    }         // Driver Code    public static void Main()    {        int []ar = { 0, 0, 1, 0, 1,                                0, 1, 1 };                                         Console.WriteLine(              findMinSwaps(ar, ar.Length));    }} // This code is contributed by vt_m.
<?php// PHP code to find minimum number of// swaps to sort a binary array // Function to find minimum swaps to// sort an array of 0s and 1s.function findMinSwaps($arr, $n){    // Array to store count of zeroes    $noOfZeroes[$n] = array();    $noOfZeroes = array_fill(0, $n, true);    $count = 0;     // Count number of zeroes    // on right side of every one.    $noOfZeroes[$n - 1] = 1 - $arr[$n - 1];    for ($i = $n - 2; $i >= 0; $i--)    {        $noOfZeroes[$i] = $noOfZeroes[$i + 1];        if ($arr[$i] == 0)            $noOfZeroes[$i]++;    }     // Count total number of swaps by adding    // number of zeroes on right side of every one.    for ($i = 0; $i < $n; $i++)    {        if ($arr[$i] == 1)            $count += $noOfZeroes[$i];    }     return $count;} // Driver code$arr = array( 0, 0, 1, 0, 1, 0, 1, 1 );$n = sizeof($arr);echo findMinSwaps($arr, $n); // This code is contributed by Sach_code?>
<script> // JavaScript program to find minimum number of// swaps to sort a binary array     function findMinSwaps(arr, n)    {        // Array to store count of zeroes        let noOfZeroes = [];        let i, count = 0;          // Count number of zeroes        // on right side of every one.        noOfZeroes[n - 1] = 1 - arr[n - 1];        for (i = n - 2; i >= 0; i--)        {            noOfZeroes[i] = noOfZeroes[i + 1];            if (arr[i] == 0)                noOfZeroes[i]++;        }          // Count total number of swaps by adding number        // of zeroes on right side of every one.        for (i = 0; i < n; i++)        {            if (arr[i] == 1)                count += noOfZeroes[i];        }        return count;    } // Driver Code         let ar = [ 0, 0, 1, 0, 1, 0, 1, 1 ];        document.write(findMinSwaps(ar, ar.length)); // This code is contributed by avijitmondal1998.</script>
3
Time Complexity: O(n) Auxiliary Space: O(n) 
Space Optimized Solution : An auxiliary space is not needed. We just need to start reading the list from the back and keep track of number of zeros we encounter. If we encounter a 1 the number of zeros is the number of swaps needed to put the 1 in correct place.
C++
Java
Python3
C#
Javascript
#include <iostream>using namespace std; int minswaps(int arr[], int n){    int count = 0;    int num_unplaced_zeros = 0;          for(int index=n-1;index>=0;index--)    {        if(arr[index] == 0)            num_unplaced_zeros += 1;        else            count += num_unplaced_zeros;    }    return count;} // Driver Codeint main(){    int arr[] = {0, 0, 1, 0, 1, 0, 1, 1};    cout<<minswaps(arr, 9);    return 0;}  // this code is contributed by Manu Pathria
import java.io.*; class GFG {    public static int minswaps(int arr[], int n)    {        int count = 0;        int num_unplaced_zeros = 0;         for (int index = n - 1; index >= 0; index--)        {            if (arr[index] == 0)                num_unplaced_zeros += 1;            else                count += num_unplaced_zeros;        }        return count;    }       // Driver Code    public static void main(String[] args)    {        int[] arr = { 0, 0, 1, 0, 1, 0, 1, 1 };        System.out.println(minswaps(arr, 9));    }} // this code is contributed by Manu Pathria
def minswaps(arr):    count = 0    num_unplaced_zeros = 0     for index in range(len(arr)-1, -1, -1):        if arr[index] == 0:            num_unplaced_zeros += 1        else:            count += num_unplaced_zeros    return count  arr = [0, 0, 1, 0, 1, 0, 1, 1]print(minswaps(arr))
using System;class GFG {         static int minswaps(int[] arr, int n)    {        int count = 0;        int num_unplaced_zeros = 0;          for (int index = n - 2; index >= 0; index--)        {            if (arr[index] == 0)                num_unplaced_zeros += 1;            else                count += num_unplaced_zeros;        }        return count;    }       static void Main() {    int[] arr = { 0, 0, 1, 0, 1, 0, 1, 1 };    Console.WriteLine(minswaps(arr, 9));  }} // This code is contributed by divyeshrabadiya07.
<script> function minswaps(arr, n){    var count = 0;    var num_unplaced_zeros = 0;          for(var index = n - 1; index >= 0; index--)    {        if(arr[index] == 0)            num_unplaced_zeros += 1;        else            count += num_unplaced_zeros;    }    return count;} // Driver Codevar arr = [0, 0, 1, 0, 1, 0, 1, 1];document.write( minswaps(arr, 9)); // This code is contributed by itsok.</script>
3
Time Complexity: O(n) Auxiliary Space: O(1)
Niraj_Pandey
vt_m
manishshaw1
Sach_Code
labsmercurial
manupathria
avijitmondal1998
itsok
divyeshrabadiya07
simmytarika5
binary-string
Arrays
Sorting
Arrays
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Stack Data Structure (Introduction and Program)
Introduction to Arrays
Multidimensional Arrays in Java