Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Project 2
- * Hyung Jun Hahn
- **/
- #include <stdio.h>
- #include <pthread.h>
- #include <stdlib.h>
- #define NUM_OF_SORTING_THREADS 2
- int *master_list;
- int size;
- typedef struct {
- int start;
- int end;
- } param;
- void *sorter(void *param); /* the thread */
- void *merger(void *param); /* the thread */
- int main(int argc, char *argv[]) {
- pthread_t tid[NUM_OF_SORTING_THREADS + 1]; // One thread is used for merging.
- pthread_attr_t attr;
- if (argc < 2) {
- printf("Usage: sorter <numbers delimited with space>");
- return -1;
- }
- size = argc - 1;
- master_list = malloc(size * sizeof(master_list[0]));
- int i;
- for (i = 1; i < argc; i++) {
- char *endptr;
- int val = strtol(argv[i], &endptr, 10);
- master_list[i - 1] = val;
- }
- for(i = 0; i < size; i++) {
- printf("Index %d: %d\n", i, master_list[i]);
- }
- for (i = 0; i < NUM_OF_SORTING_THREADS; i++) {
- param *data = (param *)malloc(sizeof(param));
- data->start = i * size / 2;
- data->end = (size/ 2 * (i + 1)) - 1;
- pthread_attr_init(&attr);
- pthread_create(&tid[i], &attr, sorter, data);
- }
- for (i = 0; i < NUM_OF_SORTING_THREADS; i++) {
- pthread_join(tid[i], NULL);
- printf("\n");
- }
- // Merging lists.
- param *data = (param *)malloc(sizeof(param));
- data->start = 0;
- data->end = size / 2;
- pthread_attr_init(&attr);
- pthread_create(&tid[2], &attr, merger, data);
- pthread_join(tid[2], NULL);
- printf("FINAL RESULT: \n");
- while (*master_list) {
- printf("%d ", *master_list++);
- }
- printf("\n");
- return 0;
- }
- void * sorter(void *params) {
- param* data = (param *)params;
- int start = data->start;
- int end = data->end + 1;
- int temp = 0;
- for (int i = start; i< end; i++) {
- for (int j = start; j< end - 1; j++) {
- if (master_list[j] > master_list[j + 1]) {
- temp = master_list[j];
- master_list[j] = master_list[j + 1];
- master_list[j + 1] = temp;
- }
- }
- }
- for (int k = start; k < end; k++) {
- printf("Sorted Array: %d\n", master_list[k]);
- }
- pthread_exit(NULL);
- }
- void * merger(void *params) {
- param* data = (param *)params;
- int start1 = data->start;
- int start2 = data->end;
- int s1 = data->end;
- int s2 = size - s1;
- int list1[s1], list2[s2];
- int i, j;
- for (i = 0; i < s1; i++) {
- list1[i] = master_list[start1 + i];
- printf("list1: %d\n", list1[i]);
- }
- for (j = 0; j < s2; j++) {
- list2[j] = master_list[start2 + j];
- printf("list2: %d\n", list2[j]);
- }
- i = 0;
- j = 0;
- int k = 0;
- while(i < s1 && j < s2) {
- if(list1[i] < list2[j]) {
- master_list[k] = list1[i];
- i++;
- } else {
- master_list[k] = list2[j];
- j++;
- }
- k++;
- }
- while(i < s1) {
- master_list[k] = list1[i];
- k++;
- i++;
- }
- while(j < s2) {
- master_list[k] = list2[j];
- k++;
- j++;
- }
- pthread_exit(NULL);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement