{ "question_id": 1104214, "question_title": "按要求排序数组", "question_content": "

 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中,数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。

", "difficulty": "简单", "answer_id": 1318491, "answer_content": "
\n#include<stdio.h>\n#include<stdlib.h>\nint oneNum(int x)\n{\n    int cnt = 0;\n    while(x)\n    {\n        cnt++;\n        x = x&(x-1);\n    }\n    return cnt;\n}\n\nint cmp(const void *a,const void*b)\n{\n    int al,bl;\n    int ret;\n    al = *(int*)a;\n    bl = *(int*)b;\n    ret =  oneNum(al) - oneNum(bl);\n    return  ret ? ret : al - bl;\n}\n\nint main()\n{\n    int s[]={1,2,3,5,6,7,8},i;\n    int len = sizeof(s)/sizeof(*s);\n    qsort(s,len,4,cmp);\n    for(i = 0 ; i < len ; i++)\n    {\n        printf(\"%d\\n\",s[i]);\n    }\n}
\n\n

 

", "tag_name": "c语言", "cpp": "#include\n#include\nint oneNum(int x)\n{\n\tint cnt = 0;\n\twhile(x)\n\t{\n\t\tcnt++;\n\t\tx = x&(x-1);\n\t}\n\treturn cnt;\n}\nint cmp(const void *a,const void*b)\n{\n\tint al,bl;\n\tint ret;\n\tal = *(int*)a;\n\tbl = *(int*)b;\n\tret = oneNum(al) - oneNum(bl);\n\treturn ret ? ret : al - bl;\n}\nint main()\n{\n\tint s[]={1,2,3,5,6,7,8},i;\n\tint len = sizeof(s)/sizeof(*s);\n\tqsort(s,len,4,cmp);\n\tfor(i = 0 ; i < len ; i++)\n\t{\n\t\tprintf(\"%d\\n\",s[i]);\n\t}\n}", "topic_link": "https://bbs.csdn.net/topics/600469952", "status": 1, "keywords": "桶排序,算法初阶,线性时间排序,排序和顺序统计量", "license": "csdn.net", "notebook": { "cpp": "https://codechina.csdn.net/csdn/csdn-daily-code/-/jupyter/master/data/notebook/answer/ipynb/cpp/84.ipynb?type=file" }, "notebook_enable": 1 }