2017-05-10 4 views
0

Ich versuche parallel Shell-Sortierung mit Thread-Bibliothek zu implementieren.Shell-Sortierung mit Threads in C++

benötigen I anfänglichen Array von ints in THN Teile zu unterteilen, sortiert sie in THN Fäden und sie schließlich miteinander verschmelzen. Der folgende Code ist ohne Merge Part, weil ich zuerst herausfinden möchte, warum die Sortierung in Threads nicht richtig funktioniert (es gibt keine Warnungen oder Fehler, die Ints bleiben einfach unsortiert).

Ich überprüft Thread Arbeit in einfachen Beispielen und alles war in Ordnung.

Also könnte mir jemand sagen, was mache ich falsch?

#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. Sie sollten einen 'std :: vector ' und 'emplace_back' für Ihren Threadvektor in' main() 'verwenden. 2. Der 'wp'-Parameter in Ihrem Thread-Aufbau-Aufruf sollte referenziert sein, um 'std :: ref (wp)'. Bsp .: Die Parameter sollten 'ShellSort, Std :: Ref (Wp), I' – WhozCraig

+0

@WhozCraig, oh, danke! Ich habe es vorher gesehen, aber ich habe es komplett vergessen ... jetzt ist es ok! – Chet

Antwort