All pastes #814500 Raw Edit

Stuff

public text v1 · immutable
·published 2007-12-13 10:52 UTC
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);
void odpalanie_watkow();


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;

//=============================

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 sekwencyjna
czas1 = clock();
mergesort(0, tab_size-1);
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 watkowa
czas1 = clock();
//bmergesort(0, tab_size-1);
odpalanie_watkow();
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 zakresu
for (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() {
  
    sr1 = (tab_size-1)/2;
    pocz1 = 0;
	kon1 = tab_size-1;
	boost::thread w1(&wat1);
	boost::thread w2(&wat2);

    bmerge(pocz1, sr1, kon1); 
    w1.join();
    w2.join();
 }    
  


void wat1(){
bmergesort(pocz1, sr1);
}

void wat2(){
bmergesort(sr1+1, kon1); 
}