Open In App

Sort an array according to count of set bits | Set 2

Given an array arr[] of positive integers, the task is to sort the array in decreasing order of count of set bits in binary representations of array elements. 
For integers having same number of set bits in their binary representation, sort according to their position in the original array i.e., a stable sort. For example, if input array is {3, 5}, then output array should also be {3, 5}. Note that both 3 and 5 have same number set bits.
Examples: 
 

Input: arr[] = {5, 2, 3, 9, 4, 6, 7, 15, 32} 
Output: 15 7 5 3 9 6 2 4 32 
The integers in their binary representation are: 
15 – 1111 
7 – 0111 
5 – 0101 
3 – 0011 
9 – 1001 
6 – 0110 
2 – 0010 
4 – 0100 
32 – 10000 
Hence, the non-increasing sorted order is: 
{15, 7, 5, 3, 9, 6, 2, 4, 32}
Input: arr[] = {1, 2, 3, 4, 5, 6}; 
Output: 3 5 6 1 2 4 
 



 

Approach: We have already discussed the method of sorting based on set bit count in the previous section with various methods. This post contains implementation using maps
As we know that a map/multimap stores data in sorted manner. So if we store (32 – countsetbits(arr[i])) for an arr[i] in map, then the output will come out in decreasing order of set bit count which is the desired output.
Below is the implementation of the above approach: 
 






// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// function to sort the array according
// to the number of set bits in elements
void sortArr(int arr[], int n)
{
    multimap<int, int> map;
 
    for (int i = 0; i < n; i++) {
        int count = 0;
        int k = arr[i];
 
        // Counting no of setBits in arr[i]
        while (k) {
            k = k & k - 1;
            count++;
        }
 
        // The count is subtracted from 32
        // because the result needs
        // to be in descending order
        map.insert(make_pair(32 - count, arr[i]));
    }
 
    // Printing the numbers in descending
    // order of set bit count
    for (auto it = map.begin(); it != map.end(); it++) {
        cout << (*it).second << " ";
    }
}
 
// Driver code
int main()
{
    int arr[] = { 5, 2, 3, 9, 4, 6, 7, 15, 32 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    sortArr(arr, n);
 
    return 0;
}




// Java implementation of the approach
import java.util.*;
 
// Compare class to sort 2d array
// by 1st value
class Compare implements Comparator<int[]> {
  @Override public int compare(int[] a, int[] b)
  {
    return a[0] - b[0];
  }
}
class GFG {
  // function to sort the array according
  // to the number of set bits in elements
  static void sortArr(int[] arr, int n)
  {
    int[][] map = new int[n][2];
 
    for (int i = 0; i < n; i++) {
      int count = 0;
      int k = arr[i];
 
      // Counting no of setBits in arr[i]
      while (k > 0) {
        k = k & k - 1;
        count++;
      }
 
      // The count is subtracted from 32
      // because the result needs
      // to be in descending order
      map[i][0] = 32 - count;
      map[i][1] = arr[i];
    }
 
    Arrays.sort(map, new Compare());
    // Printing the numbers in descending
    // order of set bit count
    for (int i = 0; i < map.length; i++) {
      System.out.print(map[i][1] + " ");
    }
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int[] arr = { 5, 2, 3, 9, 4, 6, 7, 15, 32 };
    int n = arr.length;
    sortArr(arr, n);
  }
}
 
// This code is contributed by phasing17




# Python3 implementation of the approach
 
# function to sort the array according
# to the number of set bits in elements
def sortArr(arr, n):
 
    mp = []
 
    for i in range( n):
        count = 0
        k = arr[i]
 
        # Counting no of setBits in arr[i]
        while (k):
            k = k & k - 1
            count += 1
         
        # The count is subtracted from 32
        # because the result needs
        # to be in descending order
        mp.append((32 - count, arr[i]))
 
    # Printing the numbers in descending
    # order of set bit count
    mp.sort(key = lambda x: x[0])
    for it in mp:
        print(it[1], end= " ")
 
# Driver code
if __name__ == "__main__":
     
    arr = [ 5, 2, 3, 9, 4, 6, 7, 15, 32 ]
    n = len(arr)
 
    sortArr(arr, n)
 
# This code is contributed by chitranayal




// C# implementation of the approach
using System;
using System.Collections.Generic;
 
// Compare class to sort 2d array
// by 1st value
class CompareArr : Comparer<int[]> {
  public override int Compare(int[] a, int[] b)
  {
    return a[0] - b[0];
  }
}
 
class GFG
{
 
  // function to sort the array according
  // to the number of set bits in elements
  static void sortArr(int[] arr, int n)
  {
    int[][] map = new int[n][];
 
    for (int i = 0; i < n; i++) {
      map[i] = new int[2];
      int count = 0;
      int k = arr[i];
 
      // Counting no of setBits in arr[i]
      while (k > 0) {
        k = k & k - 1;
        count++;
      }
 
      // The count is subtracted from 32
      // because the result needs
      // to be in descending order
      map[i][0] = 32 - count;
      map[i][1] = arr[i];
    }
 
    Array.Sort(map, new CompareArr());
    // Printing the numbers in descending
    // order of set bit count
    for (int i = 0; i < map.Length; i++) {
      Console.Write(map[i][1] + " ");
    }
  }
 
  // Driver code
  public static void Main(string[] args)
  {
    int[] arr = { 5, 2, 3, 9, 4, 6, 7, 15, 32 };
    int n = arr.Length;
    sortArr(arr, n);
  }
}
 
// This code is contributed by phasing17




<script>
 
// JavaScript implementation of the approach
 
// function to sort the array according
// to the number of set bits in elements
function sortArr(arr,n)
{
    let map=[];
   
    for (let i = 0; i < n; i++) {
        let count = 0;
        let k = arr[i];
   
        // Counting no of setBits in arr[i]
        while (k) {
            k = k & k - 1;
            count++;
        }
   
        // The count is subtracted from 32
        // because the result needs
        // to be in descending order
        map.push([32 - count, arr[i]]);
    }
   
      map.sort(function(a,b){return a[0]-b[0];});
    // Printing the numbers in descending
    // order of set bit count
    for (let i=0;i<map.length;i++) {
        document.write(map[i][1]+" ");
    }
}
 
// Driver code
let arr=[5, 2, 3, 9, 4, 6, 7, 15, 32 ];
let n=arr.length;
sortArr(arr, n);
 
// This code is contributed by avanitrachhadiya2155
 
</script>

Output: 
15 7 5 3 9 6 2 4 32

 

Time Complexity: O(n * log n)

Auxiliary Space: O(n)


Article Tags :