C++ 多个对象具有“0”的情况下的最佳排序算法;“不在乎”;相互关系

C++ 多个对象具有“0”的情况下的最佳排序算法;“不在乎”;相互关系,c++,sorting,vector,C++,Sorting,Vector,我有一个不寻常的分类案例,我的谷歌搜索结果很少。以下是参数: 1) 随机访问容器。(C++向量) 2) 通常向量大小较小(小于32个对象) 3) 许多对象彼此之间存在“不关心”关系,但它们并不相等。(也就是说,他们不关心其中哪一个首先出现在最终排序向量中,但他们可能会与其他对象进行不同的比较。)第三种方式(如果仍然不清楚),两个对象的比较函数可以返回3个结果:“顺序正确”、“顺序需要翻转”或“不在乎”。 4) 平等是可能的,但将是非常罕见的。(但这可能会像对待任何其他“不在乎”一样对待。” 5

我有一个不寻常的分类案例,我的谷歌搜索结果很少。以下是参数:

1) 随机访问容器。(C++向量)
2) 通常向量大小较小(小于32个对象)
3) 许多对象彼此之间存在“不关心”关系,但它们并不相等。(也就是说,他们不关心其中哪一个首先出现在最终排序向量中,但他们可能会与其他对象进行不同的比较。)第三种方式(如果仍然不清楚),两个对象的比较函数可以返回3个结果:“顺序正确”、“顺序需要翻转”或“不在乎”。
4) 平等是可能的,但将是非常罕见的。(但这可能会像对待任何其他“不在乎”一样对待。”
5) 比较运算符远比对象移动昂贵。
6) 在确定对象是否关心彼此时,没有比较速度差异。(也就是说,我不知道有什么方法可以更快地比较两个对象是否相互关心。)

7) 随机开始顺序。

您不能使用“不在乎”进行排序,这可能会扰乱元素的顺序。例如:

list = {A, B, C};
where:
A dont care B
B > C
A < C
list={A,B,C};
哪里:
A不在乎B
B>C
A

所以,即使A和B之间存在不在乎,B也必须大于A,否则其中一个将是错误的:B>C或A无论你们要做什么,考虑到你们的条件,我会确保你们起草一大堆测试用例(例如,获取一些数据集并将其洗牌数千次)因为我认为选择一种不符合您要求的排序很容易

“不在乎”这是很棘手的,因为大多数排序算法都依赖于排序值的严格顺序——如果a“小于或等于”B,B“小于或等于”C,那么它假设a小于或等于C——在您的例子中,如果a“不关心”B但关心C,但B小于C,那么a-B比较返回什么来确保A将与C进行比较

由于这个原因,而且它是小向量,我建议不要使用任何内置方法,因为我认为您会得到错误的答案,相反,我会构建一个自定义插入排序

从一个空的目标向量开始,插入第一个条目,然后为每个后续的条目扫描数组,寻找它可以插入的边界(即忽略“不关心”,找到最后一个项目,然后它必须先去),并将其插入到该间隙的中间,沿着目标向量移动其他所有对象。(即每次增加一个条目)

[如果比较操作特别昂贵,那么最好在中间开始,在一个方向上扫描,直到你击中一个界限,然后选择是否发现另一个界限是从那个界限或中间点移动……这可能会减少比较的数量,但是从阅读你所说的关于你的要求哟。例如,你不能使用二进制搜索来找到插入每个条目的正确位置]

是的,这基本上是O(n^2),但对于一个小数组来说,这不重要,你可以证明答案是正确的。然后你可以看看其他排序是否做得更好,但是除非你能为任何给定的对返回一个正确的排序,否则你会得到奇怪的结果…

你得到的是一个“偏序”

如果您有一个简单的方法来找出顺序不是“不关心”给定对象的对象,那么可以使用basic解决这个问题


如果你有很多“不在乎”(即,如果你的偏序图中只有次二次数量的边),这将比普通排序快得多——但是,如果你不在乎,算法将是二次的!

如果你对待“不在乎”这个词,我相信a将不加修改地工作结果是相等的。当然,性能还有待提高。

您似乎已经降低了要求。问题是什么,您在解决方案中做了哪些工作?是否保证“不在乎”-配对可以保持在一起,或者可能会发生这样的情况:A您如何定义元素的顺序,或者如果它们没有顺序?您是否可以轻松地“反转”查询,即,具体地获得与偏序相比“更大”的对象?@groovingandi-您的场景(相关:-“故事的寓意:当你编写一个比较函数时,你真的必须知道哪些项比其他项少。不要仅仅因为你不知道两个项的顺序而将它们声明为“相等”。“是的,你可以进行排序!但至少你得到了传递性陷阱;”+1用于获取传递性和正确的算法。