C++ 根据设置的位数对数组进行排序

C++ 根据设置的位数对数组进行排序,c++,C++,示例: 输入:arr=[0,1,2,3,4,5,6,7,8] 输出:[0,1,2,4,8,3,5,6,7] 说明:[0]是唯一具有0位的整数。 [1,2,4,8]都有1位。 [3,5,6]有2位。 [7] 有3位。 按位排序的数组是[0,1,2,4,8,3,5,6,7] 我尝试过用C++进行自定义排序,但我不知道我哪里出错了!br/> 这是我的密码 class Solution { public: static int setbits(int temp) { int c,

示例:

输入:
arr=[0,1,2,3,4,5,6,7,8]

输出:
[0,1,2,4,8,3,5,6,7]

说明:[0]是唯一具有0位的整数。
[1,2,4,8]都有1位。
[3,5,6]有2位。
[7] 有3位。
按位排序的数组是[0,1,2,4,8,3,5,6,7]

<>我尝试过用C++进行自定义排序,但我不知道我哪里出错了!br/>

这是我的密码

class Solution {
public:
    static int setbits(int temp) {
        int c, n = temp;

        while(n > 0) {
            if(n & 1) c++;

            n = n >> 1;
        }

        return c;
    }

    static bool myfun(int a, int b) {
        int c1 = setbits(a);

        int c2 = setbits(b);

        if(c1 == c2 || c1 < c2) return a < b;

        return a > b;
    }

    vector<int> sortByBits(vector<int>& arr) {
        sort(arr.begin(), arr.end(), myfun);

        return arr;
    }
};
类解决方案{
公众:
静态内部设置(内部温度){
int c,n=温度;
而(n>0){
如果(n和1)C++;
n=n>>1;
}
返回c;
}
静态boolmyfun(int a,int b){
int c1=立根节(a);
int c2=立根节(b);
如果(c1==c2 | | c1b;
}
向量排序比(向量和arr){
排序(arr.begin()、arr.end()、myfun);
返回arr;
}
};
更换

   if(c1 == c2 || c1 < c2) return a < b;

    return a > b;
if(c1==c2 | | c1b;


return(c1您忘记在
setbit
函数中初始化
c

int c = 0;
此外,比较器的逻辑也有问题,我用它得到了正确的结果

if (c1 == c2) return a < b;
return c1 < c2;
if(c1==c2)返回a

请注意,通过首先计算所有数字的权重并将其保存在一个数组中,代码可能会更有效。

StackOverflow不是一个家庭作业解决方案服务。请阅读,并创建一个演示您遇到的特定问题的示例。注意:您没有简单地将代码复制为文本,而是使用类似HTLM代码的内容。It使我们很难复制您的代码并对其进行测试。请将代码以纯文本形式粘贴到问题中的代码块中。您可以查看我制作的,以了解如何做到这一点,这样您就知道下次如何操作。如果您有C++20,请查看see RavenPoint的答案-此外,
C
setbits
中未初始化。这不正确不要做严格的弱排序。如果
comp(a,b)==true
,那么
comp(b,a)
应该是
false
,但如果它们相等,就不会是这样。而
comp(a,a)
应该是
false
。可能应该是
return(c1
这似乎可以正确地执行严格的弱排序,因此+1。一个更简单的选择可能是:
返回std::tie(c1,a)
@tedlynmo谢谢。我想这两种解决方案的效率是相同的。您的解决方案比较短,假设您对库有更好的了解!是的。
std:.tie
在形成长比较函数时非常有帮助。很容易出错,生成不符合标准库中函数要求的内容。I制作了一个C++20以供娱乐,它遵循您的排序顺序(但使用
tie
popcount
)。
if (c1 == c2) return a < b;
return c1 < c2;