需求:
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列
cpp
#include <stdio.h>
#include <stdlib.h>
void sort_accord_num_of_2radix(int*, int*, int);
int* num_of_2radix(int*, int);
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int len_arr = sizeof(arr) / sizeof(int); // ptr_array = num_of_2radix(arr, len_arr); int array[10] = { 1,1,2,1,2,2,3,1,2,2 };
int* ptr_array =num_of_2radix(arr, len_arr);
sort_accord_num_of_2radix(ptr_array, arr, len_arr);
return 0;
}
void sort_accord_num_of_2radix(int* array, int* arr, int len_arr)
{
for (int i = 9; i > 0; i--)
{
for (int j = 0; j < i; j++)
{
int tem_array = 0, tem_arr = 0;
if (array[j] > array[j + 1])
{
tem_array = array[j];
array[j] = array[j + 1];
array[j + 1] = tem_array;
tem_arr = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem_arr;
}
}
}
for (int k = 0; k < 10; k++)
{
printf("array[%d]=%d ", k, array[k]);
printf("arr[%d]=%d\n", k, arr[k]);
}
}
int* num_of_2radix(int* arr, int len_arr)
{
int* ptr_2radix_num = (int*)malloc(sizeof(int) * len_arr);
for (int r= 0; r< 10; r++)
{ //遍历arr所有元素
int sentry = 1, d = 0; //0001用于扫描
for (int s = 0; s < 16; s++)
{
if ((arr[r] & sentry))
{
d++;
}
sentry=sentry << 1; // printf("sentry=%d\n", sentry);
}
ptr_2radix_num[r] = d;
}
for (int a = 0; a < len_arr; a++)
{
printf("ptr_2radix_num[%d]=%d\n", a, ptr_2radix_num[a]);
}
return ptr_2radix_num;
}