3

假设有一个整数数组:

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:我发现“分区”功能几乎是答案,只是它只支持谓词。有什么解决方法吗?

非常感谢任何提示!

4

2 回答 2

1

既然已经实现了 stencil (可能需要从官方 Thrust 存储库获取源代码thrust::partition这可以通过以下方式实现:thrust::stable_partition

#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

此实现更有效,因为我们不对两个分区中的值进行排序。此处提供了一个类似且更复杂的示例(答案中有更多详细信息)。

于 2013-05-19T04:41:35.333 回答
1

这可以使用thrust::stable_sort_by_key().

于 2012-08-31T03:52:10.930 回答