假设有一系列整数:
A[]={2, 2, 9, 8, 5, 7, 0, 6}
和模板:
B[]={1, 0, 0, 1, 1, 1, 0, 1}
我的问题是如何根据B []重新排列A [],这样如果B [i] == 1,B [j] == 0,那么A [i]将保证在A [j]之前]在新数组中,它应该如下所示:
C[]={2, 8, 5, 7, 6, 2, 9, 0}
PS:我发现"partition"函数几乎就是答案,只是它只支持谓词。有没有解决方法?
非常感谢任何提示!
答案 0 :(得分:1)
这可以使用thrust::stable_sort_by_key()
实现。
答案 1 :(得分:1)
现在已经实施了带有模板的thrust::partition
和thrust::stable_partition
(可能需要从official Thrust repository获取来源),这可以通过以下方式实现:
#include <thrust/partition.h>
struct is_one
{
__host__ __device__
bool operator()(const int &x)
{
return x == 1;
}
};
// Partition values on device thanks to stencil
thrust::stable_partition(d_A.begin(),
d_A.end(),
d_B.begin(),
is_one());
导致:
A = 0 1 2 3 4 5 6 7 8 9 B = 0 1 1 0 0 1 0 0 1 0 C = 1 2 5 8 0 3 4 6 7 9
由于我们没有对两个分区中的值进行排序,因此这种实现更有效。可以使用类似且更复杂的示例here(答案中有更多详细信息)。