parallel_sort テンプレート関数

概要

シーケンスをソートします。

ヘッダー

#include "tbb/parallel_sort.h"

構文

template<typename RandomAccessIterator> 
void parallel_sort(RandomAccessIterator begin, RandomAccessIterator end);

template<typename RandomAccessIterator, typename Compare>
void parallel_sort(RandomAccessIterator begin, 
                   RandomAccessIterator end, 
                   const Compare& comp );

説明

シーケンス [begin1, end1) の unstable ソートを行います。unstable ソートは、等しいキーの相対的な順序を保存しません。 ソートは再現性があり、同じシーケンスのソートは毎回同じ結果になります。 イテレーターとシーケンスの要件は、std::sort と同じです。 具体的には、RandomAccessIterator はランダムアクセス・イテレーターであり、その値の型 T は次の表の要件をモデル化します。

RandomAccessIterator の値の型 T の要件

擬似署名

意味

void swap( T& x, T& y )

xy を交換します。

bool Compare::operator()( const T& x, const T& y )

xy の前に現れる場合は true。その他の場合は false。

呼び出し parallel_sort(i,j,comp) は、相対的な順序を決定するために引数 comp を使用して、シーケンス [i,j) をソートします。 comp(x,y)true を返す場合、x はソートされたシーケンスで y の前に現れます。

parallel_sort(i,j) 呼び出しは、parallel_sort(i,j,std::less<T>) と等価です。

計算量

parallel_sort は、平均時間計算量 O(N log (N)) の比較ソートです。ここで、N はシーケンスの要素の数です。 ワーカースレッドが利用可能な場合、parallel_sort は実行時間が改善されるように、同時に実行するサブタスクを作成します。

次の例は、2 つのソートを示しています。配列 a のソートは、昇順にソートするデフォルト比較を使用します。 配列 b のソートは、比較に std::greater<float> を使用して降順にソートします。

#include "tbb/parallel_sort.h"
#include <math.h>

using namespace tbb;

const int N = 100000;
float a[N];
float b[N];

void SortExample() {
    for( int i = 0; i < N; i++ ) {
       a[i] = sin((double)i);
       b[i] = cos((double)i);
    }
    parallel_sort(a, a + N);
    parallel_sort(b, b + N, std::greater<float>());
}

関連情報