https://leetcode.com/problems/sort-integers-by-the-number-of-1-bits/
1. Use STL sort() and __builtin_popcount():
- __builtin_popcount(unsigned int) is a builtin function in gcc to show how many bits in a unsigned int
- 2 -> 10 __builtin_popcount(2) = 1
- 3 -> 11 __builtin_popcount(3) = 2
- 7 -> 111 __builtin_popcount(7) = 3
- 8 -> 1000 __builtin_popcount(8) = 1
- the 3rd parameter of sort() can use a non-default sorting rule ```cpp //12 ms 10.3 MB
class Solution {
public:
vector
return arr;
}
};
<a name="u3mjG"></a>#### 2. Use STL sort():- the 3rd parameter function of sort() should be stated static or out of a class```cpp//36 ms 10.1 MBclass Solution {public:vector<int> sortByBits(vector<int>& arr) {sort(arr.begin(), arr.end(), [](int a, int b){int pa = howManyBits(a);int pb = howManyBits(b);return pa==pb ? a<b : pa<pb;});return arr;}//return bits of a numberstatic int howManyBits(int num){int count = 0;while(num > 0){if(num % 2 != 0){num = (num-1)/2;count++;} else{num = num/2;}}return count;}};
3. Use Merge Sort:
//120 ms 26.6 MBclass Solution {public:vector<int> sortByBits(vector<int>& arr) {vector<int> bit;int n = arr.size();//loop in arrfor(int i=0; i<n; i++){//record number of bitsbit.push_back(howManyBits(arr[i]));}mergeSortAdv(arr, bit);return arr;}private://return bits of a numberint howManyBits(int num){int count = 0;while(num > 0){if(num % 2 != 0){num = (num-1)/2;count++;} else{num = num/2;}}return count;}void mergeSortAdv(vector<int>& arr, vector<int>& bit){mergeSortAdv(arr, bit, 0, arr.size()-1);}void mergeSortAdv(vector<int>& arr, vector<int>& bit, int l, int r){if(l < r){int m = l + (r-l) / 2;mergeSortAdv(arr, bit, l, m);mergeSortAdv(arr, bit, m+1, r);merge(arr, bit, l, m, r);}}void merge(vector<int>& arr, vector<int>& bit, int l, int m, int r){vector<int> L_arr, R_arr;vector<int> L_bit, R_bit;int n1 = m - l + 1;int n2 = r - m;int i, j, k;for(i = 0; i < n1; i++){L_arr.push_back(arr[l + i]);L_bit.push_back(bit[l + i]);}for(j = 0; j < n2; j++){R_arr.push_back(arr[m + 1 + j]);R_bit.push_back(bit[m + 1 + j]);}i = 0;j = 0;k = l;while(i < n1 && j < n2){if(L_bit[i] <= R_bit[j]){if(L_bit[i] < R_bit[j]){bit[k] = L_bit[i];arr[k] = L_arr[i];i++;}else if(L_bit[i] == R_bit[j]){if(L_arr[i] <= R_arr[j]){bit[k] = L_bit[i];arr[k] = L_arr[i];i++;} else {bit[k] = R_bit[j];arr[k] = R_arr[j];j++;}}} else {bit[k] = R_bit[j];arr[k] = R_arr[j];j++;}k++;}while(i < n1){bit[k] = L_bit[i];arr[k] = L_arr[i];i++;k++;}while(j < n2){bit[k] = R_bit[j];arr[k] = R_arr[j];j++;k++;}}};
4. Use Swap Sort:
//72 ms 10.4 MB
class Solution {
public:
vector<int> sortByBits(vector<int>& arr) {
vector<int> bits;
int n = arr.size();
//loop in arr
for(int i=0; i<n; i++){
//record number of bits
bits.push_back(howManyBits(arr[i]));
}
swapSortAdv(arr, bits);
return arr;
}
private:
//return bits of a number
int howManyBits(int num){
int count = 0;
while(num > 0){
if(num % 2 != 0){
num = (num-1)/2;
count++;
} else{
num = num/2;
}
}
return count;
}
//swap bits and corresponding arr positions
void swapSortAdv(vector<int>& arr, vector<int>& bits){
int n = arr.size();
for(int i=0; i<n-1; i++){
for(int j=i+1; j<n; j++){
if(bits[i] > bits[j]){
swap(bits[i], bits[j]);
swap(arr[i], arr[j]);
}
if((arr[i] > arr[j]) && (bits[i] == bits[j])){
swap(arr[i], arr[j]);
}
}
}
}
};
