解题思路
原先在求二进制钻了牛角尖,非要将数组的每一个数都变成二进制,之后想再利用计算机除的性质和取余数来求得1的个数,但这样过于繁杂而且没有必要,因为我们要的只是1的个数而已。所以又十进制转换为二进制的定义即可。
代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int*cf1;//定义指针指向存放1的个数的数组
int q1gs(int x)//此为求1的个数的函数
{
int sum = 0;
int i;
while(x!=0)//二分法求1的个数,也为十进制转二进制的定义
{
i=x%2;//即每次对这个数除以2,求其余数,然后该数除以2之后下一次再除以2,再求余数,直到该数为0
sum=sum+i;//sum的和即为1的个数,因为对于除2的余数要么为1要么为0,0又不会计算,所以不用
x=x/2;//if语句来判断余数为1时再求和了,因为0加上也不碍事。
}
return sum;
}
int cmp(int*a,int*b)//此为排序函数。
{
int x,y;
x=*a;
y=*b;
if(cf1[x]!=cf1[y]){//先比1的个数是否相等
//这里注意定义的cf1数组是这样定义的,对于arr数组的每一个数都会在cf1数组中得到1个位置来存放他的
//1的个数,且arr数组每一个数都在10000之内,且cf1数组不用排什么位置,所以设arr中有个7,其在cf1位置
//的下标就是他自己的大小,这样较为方便比较。
return cf1[x]-cf1[y];//若大于0,则会认为后面的大,所以把大的放后面
}
else
{
return x-y;//直接比数字
}
}
int* sortByBits(int* arr, int arrSize, int* returnSize) {
int i;
cf1=(int*)malloc(sizeof(int)*10001);//10001是为了防止越界
memset(cf1, 0, sizeof(int) * 10001);//是全部先为0,不加也可运行
for(i=0;i<arrSize;i++)
{
cf1[arr[i]]=q1gs(arr[i]);
}
qsort(arr,arrSize,sizeof(int),cmp);//排序,注意注释,所以不用free了
*returnSize = arrSize;
return arr;
}
。