- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我偶然发现了这个 GeeksForGeeks,上面写着:使用内置排序函数重新排列正数和负数,使所有负整数出现在所有正整数之前,并且应保持出现顺序。
修改了 sort() 的比较函数以实现此目的。
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;
}
但是为什么顺序是由这个 block 维护的:
if ((a >= 0 && b >= 0) || (a < 0 && b < 0))
return false;
最佳答案
这似乎是原始文章
https://www.geeksforgeeks.org/rearrange-positive-negative-numbers-using-inbuilt-sort-function/
它(某种程度上)是如何工作的:std::sort 根据比较器重新排列所有内容。该比较器基于“所有负数彼此完全相等。所有正数彼此完全相等。负数小于正数。”
如果您根据这些规则排序,您将得到所有负数,然后是所有正数。比较器本身不会打乱它们的顺序,除了看它们是大于还是小于零。 (而且数据集很方便地没有任何零。)
出了什么问题:
1) 比较函数没有正确处理 0。它给出了错误的答案,更糟糕的是,它给出了违反严格弱排序的答案。 (见下文)
2) std::sort 不是一个稳定的排序。不能保证保持秩序。他们在一组数据上很幸运。如果他们使用了 std::stable_sort 和一个正确的比较函数,那将是一个满足要求的“内置函数”。但是单靠比较函数并不能使算法稳定。参见 What is the difference between std::sort and std::stable_sort?或者只查看 http://www.cplusplus.com/reference/algorithm/sort/ 上的文档顶部附近
3) 他们用花哨的技巧想出一个复杂度为 O(n log n) 的解决方案,来解决一个非常简单的 O(n) 问题。因此,除了在多个点上都错了之外,它毫无理由地低效。
也许他们应该考虑 https://en.cppreference.com/w/cpp/algorithm/stable_partition如果允许我们只排除数据中的零。
这是严格弱排序的定义(也由一些程序员老兄链接) https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings
For all x in S, it is not the case that x < x (irreflexivity).
For all x, y in S, if x < y then it is not the case that y < x (asymmetry).
For all x, y, z in S, if x < y and y < z then x < z (transitivity).
For all x, y, z in S, if x is incomparable with y (neither x < y nor y < x hold), and y is incomparable with z, then x is incomparable with z (transitivity of incomparability).
请注意 comp(0, anything) 返回 false,因此 1 < 0 很容易破坏传递性,而且显然是错误的。
关于c++ - 给定条件如何维持发生顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51008911/
我有一个非常基本的 java 迭代器场景...在其中面临以下寻找迭代器工作的问题 迭代器 logIterator 在两个 while 循环中是否具有相同的值,或者它会在第二个 while 循环中结束并
我正在开发一个 REACT Web 应用程序。我正在使用react-datasheet库并使用NPM安装。现在为了使其支持 IE11,我对 NPM 安装的 javascript 文件做了一些更改。这适
我正在使用 esp8266 Arduino(通过 Adafruit Feather Huzzah),我试图连续向 TCP 套接字写入 3 个字符,但没有任何连续的内容。它具有非常规则的高低带宽模式。它
我是一名优秀的程序员,十分优秀!