rendered paste body#include <iostream>#include <stdio.h>#include <stdlib.h>#include <time.h>#include <boost/thread/thread.hpp>#include <iomanip>using namespace std;unsigned int tab_size;//======= NAGLOWKI ============int DEBUG = 0;const int maxw = 100;const int minw = 0;int * tab;int * temptab;int * tab2;int pocz1=0, sr1=0, kon1=tab_size-1;bool useboost = 1;void prepare();void wypisz(int* tablica);void clear_temp();inline void merge(int pocz, int sr, int kon);inline void mergesort(int pocz, int kon);inline void bmerge(int pocz, int sr, int kon);inline void bmergesort(int pocz, int kon);void wat1();void wat2();boost::thread w1;boost::thread w2;void odpalanie_watkow();//=============================int main(){time_t czas1, czas2;cout<<"DEBUG MODE [0/1/2]: "<<endl;cin >> DEBUG;cout<<"Rozmiar tablicy: "<<endl;cin >> tab_size;tab = new int[tab_size];temptab = new int[tab_size];tab2 = new int[tab_size];prepare();if(DEBUG == 1){cout<<"Tablica przed posortowaniem: "<<endl;wypisz(tab);}//=========== wersja sekwencyjnaczas1 = clock();//mergesort(0, tab_size-1);odpalanie_watkow();czas2 = clock();double czas = double(czas2-czas1)/CLOCKS_PER_SEC;cout<<"Czas sortowania tablicy sekwencyjnie: "<<setprecision(6)<<czas<<" s."<<endl;//==============================if(DEBUG == 1){cout<<"Tablica posortowana: "<<endl;wypisz(tab);}if(DEBUG == 1 || DEBUG == 2){cout<<"Tablica przed posortowaniem: "<<endl;wypisz(tab2);}//=========== wersja watkowaczas1 = clock();bmergesort(0, tab_size-1);czas2 = clock();czas = double(czas2-czas1)/CLOCKS_PER_SEC;cout<<"Czas sortowania tablicy w 2 watkach: "<<czas<<" s."<<endl;//==============================if(DEBUG == 1 || DEBUG == 2){cout<<"Tablica posortowana: "<<endl;wypisz(tab2);}delete tab;delete temptab;delete tab2;}void prepare(){srand((unsigned int)time(NULL));//zapelnianie tablicy losowymi liczbami z pewnego zakresufor (unsigned int i=0; i<tab_size; i++){tab[i] = rand()%(maxw-minw+1)+minw;tab2[i] = tab[i];}}void wypisz(int* tablica){for (unsigned int i=0; i<tab_size; i++){cout<<tablica[i]<<", ";}cout<<endl<<endl;}void merge(int pocz, int sr, int kon){ int i,j,q; for (i=pocz; i<=kon; i++) temptab[i]=tab[i]; // Skopiowanie danych do tablicy pomocniczej i=pocz; j=sr+1; q=pocz; while (i<=sr && j<=kon) { if (temptab[i]<temptab[j]) tab[q++]=temptab[i++]; else tab[q++]=temptab[j++]; } while (i<=sr) tab[q++]=temptab[i++];}void mergesort(int pocz, int kon){ int sr; if (pocz<kon) { sr=(pocz+kon)/2; mergesort(pocz, sr); // Dzielenie lewej czesci mergesort(sr+1, kon); // Dzielenie prawej czesci merge(pocz, sr, kon); // laczenie czesci lewej i prawej }}//========================================// FUNKCJE DOTYCZACE WATKOW//========================================void bmerge(int pocz, int sr, int kon){ int i,j,q; for (i=pocz; i<=kon; i++) temptab[i]=tab2[i]; // Skopiowanie danych do tablicy pomocniczej i=pocz; j=sr+1; q=pocz; while (i<=sr && j<=kon) { if (temptab[i]<temptab[j]) tab2[q++]=temptab[i++]; else tab2[q++]=temptab[j++]; } while (i<=sr) tab2[q++]=temptab[i++];}void bmergesort(int pocz, int kon){ if (pocz<kon) { int sr=(pocz+kon)/2; bmergesort(pocz, sr); // Dzielenie lewej czesci bmergesort(sr+1, kon); // Dzielenie prawej czesci bmerge(pocz, sr, kon); // laczenie czesci lewej i prawej }} void odpalanie_watkow() { time_t czas1, czas2;double czas; sr1 = (tab_size-1)/2; pocz1 = 0; kon1 = tab_size-1;czas1 = clock(); boost::thread w1(&wat1); boost::thread w2(&wat2);czas2 = clock();czas = double(czas2-czas1)/CLOCKS_PER_SEC;cout << "czas przed 1 join:" << czas << endl; w1.join();czas2 = clock();czas = double(czas2-czas1)/CLOCKS_PER_SEC;cout << "czas przed 2 join:" << czas << endl; w2.join();czas2 = clock();czas = double(czas2-czas1)/CLOCKS_PER_SEC;cout << "czas przed bmerge:" << czas << endl; bmerge(pocz1, sr1, kon1); czas2 = clock();czas = double(czas2-czas1)/CLOCKS_PER_SEC;cout << "czas koncowy:" << czas << endl; } void wat1(){bmergesort(pocz1, sr1);}void wat2(){bmergesort(sr1+1, kon1); }