2017-05-10 13 views
0

スレッドライブラリを使用して並列シェルソートを実装しようとしています。C++のスレッドを使用したシェルソート

私は、THNに部品をintの初期配列を分割THNのスレッドでそれらを並べ替え、最後にそれらを一緒にマージする必要があります。以下のコードは、最初はスレッド内のソートが正しく動作しない理由を知りたいので(警告や間違いはなく、intはソートされていないので)、マージ部分がありません。

私はスレッドの作業を簡単な例でチェックしましたが、すべて正常でした。

誰も私に間違っていることを教えてもらえますか?

#include "stdafx.h" 
#include <iostream> 
#include <thread> 
#include <ctime> 
#include <vector> 
using namespace std; 

void shellSort(vector <vector<int>>& wp, int k) 
{ 
    int n = wp[k].size(); 
    for (int gap = n/2; gap > 0; gap /= 2) 
    { 

     for (int i = gap; i < n; i++) 
     { 
      int temp = wp[k][i]; 
      int j; 
      for (j = i; j >= gap && wp[k][j - gap] > temp; j -= gap) 
       wp[k][j] = wp[k][j - gap]; 
      wp[k][j] = temp; 
     } 
     } 
} 

    int main() 
{ 
    int N, thN, i; 
    cout << "\nEnter the length of array: "; 
    cin >> N; 
    cout << "\nEnter the amount of threads: "; 
    cin >> thN; 
    int* A = new int[N]; 
    for (i = 0; i < N; i++) 
     A[i] = rand() % 100; 

    thread* t = new thread[thN]; 

    vector<vector<int> > wp(thN, vector<int>()); 

    int start = 0; 
    for (i = 0; i < thN; i++){ 
     for (int j = start; j < start + N/thN; j++){ 
      wp[i].push_back(A[j]); 
     } 
     start += N/thN; 
    } 

    double endTime, startTime; 
    startTime = clock(); 

    for (i = 0; i < thN; i++) 
     t[i] = thread(shellSort,wp,i); 

    for (i = 0; i < thN; i++) 
     t[i].join(); 

    endTime = clock(); 

    cout << "Runtime of shell sort: " << (endTime - startTime)/1000 << endl;// time in miliseconds 
    system("pause"); 
} 
+0

1. 'main()'のスレッドベクトルに 'std :: vector 'と 'emplace_back'を使ってください。 2.スレッド構築呼び出しの 'wp'パラメータは' std :: ref(wp) 'の参照でラップされるべきです。例:パラメータは 'shellSort、std :: ref(wp)、i'でなければなりません。 – WhozCraig

+0

@WhozCraig、ありがとう!私はそれを前に見たが、これを完全に忘れてしまった。今は大丈夫だ! – Chet

答えて

関連する問題