稳定排序和具有两个比较的排序之间有区别吗? 这是C++的。我知道一个稳定排序会在记住关系的原始顺序的情况下进行排序,但我记得稳定排序的时间复杂度是O(n*logn^2),所以我想知道:如果我将我的值存储到一对中,第一个包含值,第二个包含原始位置(即[5,2,2,3,1]-->[(5,0),(2,1),(2,2),(3,3),(1,4)],我用它作为比较标准: bool compare(const pair<int,int> &left, const pair<int,int> &right){ return left.first < right.first || (left.first == right.first && left.second < right.second); } bool比较(常数对和左、常数对和右){ 返回left.first

稳定排序和具有两个比较的排序之间有区别吗? 这是C++的。我知道一个稳定排序会在记住关系的原始顺序的情况下进行排序,但我记得稳定排序的时间复杂度是O(n*logn^2),所以我想知道:如果我将我的值存储到一对中,第一个包含值,第二个包含原始位置(即[5,2,2,3,1]-->[(5,0),(2,1),(2,2),(3,3),(1,4)],我用它作为比较标准: bool compare(const pair<int,int> &left, const pair<int,int> &right){ return left.first < right.first || (left.first == right.first && left.second < right.second); } bool比较(常数对和左、常数对和右){ 返回left.first,c++,sorting,C++,Sorting,那么,除了现在的O(nlogn)时间之外,我不会有与稳定排序相同的效果吗? 如果没有,是什么使它们不同/相似?如果您查看,您可以看到: O(N·log(N)2),其中N=标准::cmp的距离(第一个,最后一个)应用。如果有额外的内存可用,则复杂度为O(N·log(N)) 因此,一般来说,如果有足够的辅助内存,那么复杂性将是您指定的较低项(可能使用您指定的技术,尽管标准没有规定)。然而,标准要求保证操作完成,因此如果内存不可用,它将使用一种更慢但更可靠的技术,不需要额外的内存。您回忆不正确——存在

那么,除了现在的O(nlogn)时间之外,我不会有与稳定排序相同的效果吗? 如果没有,是什么使它们不同/相似?

如果您查看,您可以看到:

O(N·log(N)2),其中N=标准::cmp的距离(第一个,最后一个)应用。如果有额外的内存可用,则复杂度为O(N·log(N))


因此,一般来说,如果有足够的辅助内存,那么复杂性将是您指定的较低项(可能使用您指定的技术,尽管标准没有规定)。然而,标准要求保证操作完成,因此如果内存不可用,它将使用一种更慢但更可靠的技术,不需要额外的内存。

您回忆不正确——存在稳定的O(n*logn)排序算法。例如,见。您描述的版本是的应用程序。

不要被复杂度界限所误导。请注意,如果您的比较器更复杂,即使您的大Oh相同,您的常数因子也会增加。还请注意,
std::stable_sort
在内存不足时仅为
O(n log^2 n)
。但是,如果没有足够的额外内存,该怎么办?文档中说明了这一点:@jkwon0866请参阅更新的答案。另外,我建议你避免拍摄cplusplus.com.Ah,cplusplus.com不准确吗?我一直在使用那个网站。@jkwon0866,是的,我推荐cppreference.com。你可以随意投票或者接受有用的答案。但是,如果没有足够的额外记忆呢?文档中说明了polyloglinear:cplusplus.com/reference/algorithm/stable\u sort