当使用自定义比较器时,如何在C++中执行稳定排序



我正在尝试用C++编写一个自定义比较器来对向量进行排序。为了简单起见,我会说我的排序标准是所有偶数值都应该在所有奇数值之前,我正在尝试为此编写一个自定义比较器。但我需要确保所有偶数元素和所有奇数元素的相对顺序都保持不变。

我使用的是这个代码:

bool mysort(int arg1,int arg2){
return arg1%2==0;
}
int main(){
vector<int> v({1,3,2,4,5,7,9,6,8,11,10,12});
stable_sort(v.begin(),v.end(),mysort);
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
return 0;
}

根据我的理解,当mysort((返回true时,意味着第一个参数(arg1(被允许在第二个参数(arg2(之前。这就是为什么我在比较器中使用return arg1%2==0;

但是我得到的输出是12 10 8 6 4 2 1 3 5 7 9 11。这意味着,偶数元素的相对顺序颠倒了。同时,保留了奇数元素的相对顺序。

相反,如果我在mysort()比较器中使用return i%2==0 && j%2!=0;,我得到的输出是2 4 6 8 10 12 1 3 5 7 9 11。它保留了所有奇数和偶数元素的相对顺序。

为什么会有这种行为?在保留相似元素的相对顺序的情况下,编写自定义比较器的最佳方法是什么?提前谢谢。

我相信你知道,stable_sort保留了比较相等的元素的顺序。为此,当ij比较相等时,mysort (i, j)mysort (j, i)都必须返回false。(当然,当i < j时,它也必须返回true。(

因此,您必须在mysort中测试arg1 % 2arg2 % 2才能履行此合同,而return arg1 % 2 == 0 && arg2 % 2 != 0;正是您想要的:无论参数传递给它的顺序如何,当arg1 % 2arg2 % 2比较相等时,它都会返回false

sortstable_sort的比较器必须导出严格弱阶。您的比较器不满足此条件。

严格弱序的一个性质是,对于ij的任何允许值,mysort(i,j)mysort(j,i)中最多有一个可以返回true。比较器在两种情况下都返回true,例如i=2j=4

要解决这个问题,您必须修改比较器。当是CCD_ 33〃时;较少的";而不是CCD_ 34?只有一种情况:当arg1是偶数而arg2是奇数时。因此,一个可用的定义是:

bool mysort(int arg1,int arg2){
return arg1 % 2 == 0 && arg2 % 2 != 0;
}

顺便说一句,当你定义一个比较器时,你没有时间考虑算法将以何种顺序传递参数。所有(早先的、后来的(讨论都无关紧要。该算法将按其喜欢的任何顺序传递参数。没有任何保证。

STL使用小于compare,这意味着std::stable_sort((将以相反的顺序传递参数,它将调用mysort(later_object,early object(,因此如果later_object<earlier_object(将later_object复制到合并输出(,如果later_object>=earlier_object(将earlier_object复制到合并输出(。

最新更新