CUDA初学者-Thrust - Algorithms - Sorting(8)

本人 CUDA小白一枚,要是有什么不对,还望各位大佬指点。
本文及后面的几篇将分别从几个方面来大概阐述一下Thrust的一些接口。原来的网址在这里

1.Algorithms

1.8 Sorting
1.8.1 sort

template <typename DerivedPolicy, typename RandomAccessIterator>
__host__ __device__ void thrust::sort(
	const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
  	RandomAccessIterator first,
 	RandomAccessIterator last
);

template <typename RandomAccessIterator>
void thrust::sort(
  	RandomAccessIterator first,
 	RandomAccessIterator last
);

template <typename DerivedPolicy, typename RandomAccessIterator, typename StrictWeakOrdering>
__host__ __device__ void thrust::sort(
	const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
  	RandomAccessIterator first,
  	RandomAccessIterator last,
  	StrictWeakOrdering comp
);

template <typename RandomAccessIterator, typename StrictWeakOrdering>
void thrust::sort(
  	RandomAccessIterator first,
  	RandomAccessIterator last,
  	StrictWeakOrdering comp
);

排序,默认升序,可以指定排序方式comp。
例子:

const int N = 6;
int A[N] = {1, 4, 2, 8, 5, 7};
thrust::sort(thrust::host, A, A + N);
// thrust::sort(A, A + N);
// A   {1, 2, 4, 5, 7, 8}

int B[N] = {1, 4, 2, 8, 5, 7};
thrust::sort(thrust::host, B, B + N, thrust::greater<int>());
// thrust::sort(B, B + N, thrust::greater<int>());
// B   {8, 7, 5, 4, 2, 1};

1.8.2 stable_sort

template <typename DerivedPolicy,
  typename RandomAccessIterator>
__host__ __device__ void
thrust::stable_sort(const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
  RandomAccessIterator first,
  RandomAccessIterator last);

template <typename RandomAccessIterator>
void
thrust::stable_sort(RandomAccessIterator first,
  RandomAccessIterator last);

template <typename DerivedPolicy, typename RandomAccessIterator, typename StrictWeakOrdering>
__host__ __device__ void thrust::stable_sort(
	const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
  	RandomAccessIterator first,
  	RandomAccessIterator last,
  	StrictWeakOrdering comp
);

template <typename RandomAccessIterator, typename StrictWeakOrdering>
void thrust::stable_sort(RandomAccessIterator first,
  	RandomAccessIterator last,
  	StrictWeakOrdering comp
);

相较于sort而言,针对相同的元素,可以保持原有的先后顺序。
例子:

const int N = 6;
int A[N] = {1, 4, 2, 8, 5, 7};
thrust::stable_sort(thrust::host, A, A + N);
// thrust::stable_sort(A, A + N);
// A   {1, 2, 4, 5, 7, 8}

int B[N] = {1, 4, 2, 8, 5, 7};
thrust::stable_sort(thrust::host, B, BS + N, thrust::greater<int>());
// thrust::stable_sort( B, BS + N, thrust::greater<int>());
// B   {8, 7, 5, 4, 2, 1};

1.8.3 sort_by_key

template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2>
__host__ __device__ void thrust::sort_by_key(
	const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
  	RandomAccessIterator1 keys_first,
  	RandomAccessIterator1 keys_last,
  	RandomAccessIterator2 values_first
);

template <typename RandomAccessIterator1, typename RandomAccessIterator2>
void thrust::sort_by_key(
  	RandomAccessIterator1 keys_first,
  	RandomAccessIterator1 keys_last,
  	RandomAccessIterator2 values_first
);

template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering>
__host__ __device__ void thrust::sort_by_key(
	const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
  	RandomAccessIterator1 keys_first,
  	RandomAccessIterator1 keys_last,
  	RandomAccessIterator2 values_first,
  	StrictWeakOrdering comp
);

template <typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering>
void thrust::sort_by_key(
  	RandomAccessIterator1 keys_first,
  	RandomAccessIterator1 keys_last,
  	RandomAccessIterator2 values_first,
  	StrictWeakOrdering comp
);

相较于sort而言,是针对key来排序,然后将对应的value按照排序之后的结果重新保存。同样可以指定排序方式。
例子:

const int N = 6;
int keys[N] = {1, 4, 2, 8, 5, 7};
char values[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
thrust::sort_by_key(thrust::host, keys, keys + N, values);
// thrust::sort_by_key(keys, keys + N, values);
// keys  {1, 2, 4, 5, 7, 8}
// values  {'a', 'c', 'b', 'e', 'f', 'd'}

int keys1[N] = {  1,   4,   2,   8,   5,   7};
char values1[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
thrust::sort_by_key(thrust::host, keys1, keys1 + N, values1, thrust::greater<int>());
// thrust::sort_by_key(keys1, keys1 + N, values1, thrust::greater<int>());
// keys1   {8, 7, 5, 4, 2, 1}
// values1   {'d', 'f', 'e', 'b', 'c', 'a'}

1.8.4 stable_sort_by_key

template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2>
__host__ __device__ void thrust::stable_sort_by_key(
	const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
  	RandomAccessIterator1 keys_first,
  	RandomAccessIterator1 keys_last,
  	RandomAccessIterator2 values_first
);

template <typename RandomAccessIterator1, typename RandomAccessIterator2>
void thrust::stable_sort_by_key(
	RandomAccessIterator1 keys_first,
  	RandomAccessIterator1 keys_last,
  	RandomAccessIterator2 values_first
);

template <typename DerivedPolicy, typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering>
__host__ __device__ void thrust::stable_sort_by_key(
	const thrust::detail::execution_policy_base< DerivedPolicy > & exec,
  	RandomAccessIterator1 keys_first,
  	RandomAccessIterator1 keys_last,
  	RandomAccessIterator2 values_first,
  	StrictWeakOrdering comp
);

template <typename RandomAccessIterator1, typename RandomAccessIterator2, typename StrictWeakOrdering>
void thrust::stable_sort_by_key(
	RandomAccessIterator1 keys_first,
  	RandomAccessIterator1 keys_last,
  	RandomAccessIterator2 values_first,
  	StrictWeakOrdering comp
);

相较于stable_sort,这边的排序是根据的key来排序,同时对应的value也会同步变动。可指定排序方式。

const int N = 6;
int keys[N] = {1, 4, 2, 8, 5, 7};
char values[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
thrust::stable_sort_by_key(thrust::host, keys, keys + N, values);
// thrust::stable_sort_by_key(keys, keys + N, values);
// keys  {1, 2, 4, 5, 7, 8}
// values  {'a', 'c', 'b', 'e', 'f', 'd'}

int keys1[N] = {  1,   4,   2,   8,   5,   7};
char values1[N] = {'a', 'b', 'c', 'd', 'e', 'f'};
thrust::stable_sort_by_key(thrust:host, keys1, keys1 + N, values1, thrust::greater<int>());
// thrust::stable_sort_by_key(keys1, keys1 + N, values1, thrust::greater<int>());
// keys1   {8, 7, 5, 4, 2, 1}
// values1   {'d', 'f', 'e', 'b', 'c', 'a'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值