我有一个元素为[0, 1, 0, 3, 12]
的数组。我想把所有的零移到它的末尾,同时保持非零元素的相对顺序。移位后的数组应该像这样[1, 3, 12, 0, 0]
。所以我写了下面的代码:
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a, int b){
if (a == 0) {
return a > b;
} else {
return true;
}
}
int main(){
int arr[] = {0, 1, 0, 3, 12};
sort(arr, arr + 5, cmp);
for (int i: arr) {
cout << i;
}
}
我写这段代码的想法是,通过返回false
,每当零被放置在一个非零元素之前,i
可以交换元素,但这段代码给出的输出为[12, 3, 1, 0, 0]
,即它只是按降序排序的元素。有人能解释我为什么我的比较器函数不工作吗?我可以使用比较器函数来做到这一点吗?
2条答案
按热度按时间2eafrhcq1#
您的比较函数不满足比较函数的要求。例如,如果
cmp( a, b )
返回true
,则cmp( b, a )
应返回false
。不使用算法
std::sort
,而是使用算法std::stable partition
,例如另一方面,如果非零元素不按例如
如果你想对它们进行排序,你可以用下面的方式来调用
std::sort
这里有一个演示功能
程序输出为
或者,如果你愿意,你可以写一个单独的比较函数来代替lambda表达式
在本例中,
std::sort
的调用如下所示:k4ymrczo2#
传递给
std::sort
的比较器需要是strict weak order。特别是,对于相同的值,您需要cmp(x, x) = false
,并且cmp(x, y)
和cmp(y, x)
中最多有一个为真(对于cmp(1, 2) == cmp(2, 1) == true
,这不是真)你想要的是在你的订单中所有元素都是相等的,除了0,它大于所有其他元素。这可以用这样的函数来完成:
然后你想使用
std::stable_sort
来保持等价元素的顺序。然而,排序并不是最好的方法。你可以简单地将所有非零元素向前移动,然后用0填充后面的空格:
这个算法的第一部分是
std::remove
所做的: