C++ 给定的条件如何维持发生顺序
我遇到了一个Geeksforgeks,上面写着:使用内置的排序函数重新排列正数和负数,使所有负整数出现在所有正整数之前,应保持出现顺序 sort()的comparator函数被修改以实现这一点C++ 给定的条件如何维持发生顺序,c++,sorting,stl,C++,Sorting,Stl,我遇到了一个Geeksforgeks,上面写着:使用内置的排序函数重新排列正数和负数,使所有负整数出现在所有正整数之前,应保持出现顺序 sort()的comparator函数被修改以实现这一点 bool comp(int a, int b) { // This is to maintain order if ((a >= 0 && b >= 0) || (a < 0 && b < 0)) return fal
bool comp(int a, int b)
{
// This is to maintain order
if ((a >= 0 && b >= 0) || (a < 0 && b < 0))
return false;
// Swapping is must
if ((a >= 0) && (b < 0))
return false;
return true;
}
bool comp(内部a、内部b)
{
//这是为了维持秩序
如果((a>=0&&b>=0)| |(a<0&&b<0))
返回false;
//交换是必须的
如果((a>=0)和&(b<0))
返回false;
返回true;
}
但是,这个区块如何维持秩序:
if ((a >= 0 && b >= 0) || (a < 0 && b < 0))
return false;
if((a>=0&&b>=0)| |(a<0&&b<0))
返回false;
这似乎是原文
工作原理:std::sort根据比较器重新排列所有内容。此比较器基于“所有负数都完全相等。所有正数都完全相等。负数小于正数。”
如果你按照这些规则排序,你会得到所有的负数,然后是所有的正数。比较器本身不会打乱它们的顺序,只看它们是大于还是小于零。(而且数据集没有任何零。)
出了什么问题:
1) 比较函数无法正确处理0。它给出了错误的答案,更糟糕的是,它给出的答案违反了严格的弱顺序。(见下文)
2) 排序不是一种稳定的排序。它不能保证维持秩序。他们在一组数据上很幸运。如果他们使用了std::stable_sort和一个正确的比较函数,那么它将是一个满足要求的“内置函数”。但是仅仅使用比较函数并不能使算法稳定。查看或仅查看屏幕上文档顶部附近的内容
3) 对于一个简单的O(n)问题,他们会想出一个复杂度为O(n logn)的解决方案。因此,除了在多个点上出错之外,它没有充分的理由是低效的
也许他们应该考虑是否允许我们排除数据中的零
这里是严格弱排序的定义(也有一些程序员的链接)
对于S中的所有x,x
注意comp(0,anywhere)返回false,因此1<0除了明显错误之外,还容易破坏传递性。这似乎是原文 工作原理:std::sort根据比较器重新排列所有内容。此比较器基于“所有负数都完全相等。所有正数都完全相等。负数小于正数。” 如果你按照这些规则排序,你会得到所有的负数,然后是所有的正数。比较器本身不会打乱它们的顺序,只看它们是大于还是小于零。(而且数据集没有任何零。) 出了什么问题: 1) 比较函数无法正确处理0。它给出了错误的答案,更糟糕的是,它给出的答案违反了严格的弱顺序。(见下文) 2) 排序不是一种稳定的排序。它不能保证维持秩序。他们在一组数据上很幸运。如果他们使用了std::stable_sort和一个正确的比较函数,那么它将是一个满足要求的“内置函数”。但是仅仅使用比较函数并不能使算法稳定。查看或仅查看屏幕上文档顶部附近的内容 3) 对于一个简单的O(n)问题,他们会想出一个复杂度为O(n logn)的解决方案。因此,除了在多个点上出错之外,它没有充分的理由是低效的 也许他们应该考虑是否允许我们排除数据中的零
这里是严格弱排序的定义(也有一些程序员的链接)
对于S中的所有x,x
请注意,comp(0,anything)返回false,因此1<0很容易破坏传递性,而且显然是错误的。comp函数破坏了
if ((a >= 0 && b >= 0) || (a < 0 && b < 0))
return false;
if((a>=0&&b>=0)| |(a<0&&b<0))
返回false;
如果a为0且b为+ve,则a小于b,但返回false,而不是true
试一试
bool comp(内部a、内部b)
{
常数int first=((a<0)?-1:(a==0)?0:1);
常数int秒=((b<0)?-1:(b==0)?0:1);
返回(第一次<第二次);
}
并将其插入std::stable_sort中,comp函数会打破严格的弱排序
if ((a >= 0 && b >= 0) || (a < 0 && b < 0))
return false;
if((a>=0&&b>=0)| |(a<0&&b<0))
返回false;
如果a为0且b为+ve,则a小于b,但返回false,而不是true
试一试
bool comp(内部a、内部b)
{
常数int first=((a<0)?-1:(a==0)?0:1);
常数int秒=((b<0)?-1:(b==0)?0:1);
返回(第一次<第二次);
}
并将其插入std::stable\u排序
但是,这个区块如何维持秩序:
命令不是
bool comp(int a, int b)
{
const int first = ((a < 0) ? -1 : (a == 0) ? 0 : 1);
const int second = ((b < 0) ? -1 : (b == 0) ? 0 : 1);
return (first < second);
}