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

26 Nov, 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++
Python3
Javascript
// 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 elementsvoid 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 codeint main(){    int arr[] = { 5, 2, 3, 9, 4, 6, 7, 15, 32 };    int n = sizeof(arr) / sizeof(arr[0]);     sortArr(arr, n);     return 0;}
# Python3 implementation of the approach # function to sort the array according# to the number of set bits in elementsdef 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 codeif __name__ == "__main__":         arr = [ 5, 2, 3, 9, 4, 6, 7, 15, 32 ]    n = len(arr)     sortArr(arr, n) # This code is contributed by chitranayal
<script> // JavaScript implementation of the approach // function to sort the array according// to the number of set bits in elementsfunction 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 codelet arr=[5, 2, 3, 9, 4, 6, 7, 15, 32 ];let n=arr.length;sortArr(arr, n); // This code is contributed by avanitrachhadiya2155 </script>
15 7 5 3 9 6 2 4 32
 
Time Complexity: O(n * log n)
Auxiliary Space: O(n)
ukasp
avanitrachhadiya2155
subhammahato348
setBitCount
Arrays
Bit Magic
Sorting
Arrays
Bit Magic
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
Introduction to Arrays
Multidimensional Arrays in Java
Linear Search
Linked List vs Array
Bitwise Operators in C/C++
Left Shift and Right Shift Operators in C/C++
Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
Count set bits in an integer
How to swap two numbers without using a temporary variable?