Related Articles

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

• Difficulty Level : Hard
• Last Updated : 31 May, 2021

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++

 `// C++ implementation of the approach``#include ``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);` `    ``sortArr(arr, n);` `    ``return` `0;``}`

## Python3

 `# 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`

## Javascript

 ``
Output:
`15 7 5 3 9 6 2 4 32`

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up