# g++ -lpthread project1-6b.cc -o project1-6b # #include #include #include #include #include #include #include #include #define ARRAYSIZE 10000000 #define NUMTHREADS 10000000 void quickSort(int* array, int first, int last, int numThreads = 1); void* quickSort(void*); int partition(int* array, int first, int last, int pivotIndex); struct quickSort_args { int* array; int first; int last; int numThreads; }; int main() { int* myArray; int i,j; timeval t1,t2; printf("\nSorting an array of %d integers using %d threads...\n\n",ARRAYSIZE,NUMTHREADS); myArray = new int[ARRAYSIZE]; //gettimeofday(&t1,NULL); //srand(t1.tv_usec); srand(8675309); for(i=0;iarray, myArgs->first, myArgs->last, myArgs->numThreads); return NULL; } void quickSort(int* array, int first, int last, int numThreads) { int pivotIndex; pthread_t* t1; pthread_t* t2; pthread_attr_t* attr; quickSort_args* a1; quickSort_args* a2; if(first=2) { numThreads = numThreads-2; t1 = new pthread_t; t2 = new pthread_t; attr = new pthread_attr_t; a1 = new quickSort_args; a2 = new quickSort_args; pthread_attr_init(attr); pthread_attr_setscope(attr,PTHREAD_SCOPE_SYSTEM); pthread_attr_setdetachstate(attr,PTHREAD_CREATE_JOINABLE); a1->array = array; a1->first = first; a1->last = pivotIndex-1; a2->array = array; a2->first = pivotIndex+1; a2->last = last; if((numThreads/2)%2 == 0) { a1->numThreads = numThreads/2; a2->numThreads = numThreads/2; } else { a1->numThreads = numThreads/2 +1; a2->numThreads = numThreads/2 -1; } //printf("Creating 2 new threads.\n"); pthread_create(t1, attr, quickSort,(void*)a1); pthread_create(t2, attr, quickSort,(void*)a2); pthread_join(*t1,NULL); pthread_join(*t2,NULL); delete t1; delete t2; delete attr; delete a1; delete a2; } else { quickSort(array,first,pivotIndex-1); quickSort(array,pivotIndex+1,last); } } } int partition(int* array, int first, int last, int pivotIndex) { int temp; int writeIndex; int pivotValue; pivotValue = array[pivotIndex]; array[pivotIndex] = array[last]; array[last] = pivotValue; writeIndex = first; for(int i = first; i < last;i++) { if(array[i] <= pivotValue) { temp = array[i]; array[i] = array[writeIndex]; array[writeIndex++] = temp; } } temp = array[writeIndex]; array[writeIndex] = array[last]; array[last] = temp; return writeIndex; }