diff --git a/MergesortMulti b/MergesortMulti new file mode 100755 index 0000000..171f64e Binary files /dev/null and b/MergesortMulti differ diff --git a/MergesortMulti.c b/MergesortMulti.c new file mode 100644 index 0000000..a01af65 --- /dev/null +++ b/MergesortMulti.c @@ -0,0 +1,103 @@ +#include "cse356header.h" + +int numbers[1000000], temp[1000000]; + +struct arg_struct { + int le; + int ri; +}; + +void *m_sort(void *args); +void merge(int left, int mid, int right); + +void mergeSort(int array_size) +{ + struct arg_struct aus; + aus.le = 0; aus.ri = array_size - 1; + pthread_t mth; + pthread_create(&mth, NULL, m_sort, &aus); + pthread_join(mth, NULL); +} + + +void *m_sort(void *args) +{ + struct arg_struct *aus = (struct arg_struct *) args; + int mid, left = aus->le, right = aus->ri; + + if (right > left) + { + mid = (right + left) / 2; + pthread_t lth, rth; + struct arg_struct lst, rst; + lst.le = left; lst.ri = mid; + rst.le = mid + 1; rst.ri = right; + + pthread_create(<h, NULL, m_sort, &lst); + pthread_create(&rth, NULL, m_sort, &rst); + + pthread_join(lth, NULL); + pthread_join(rth, NULL); + merge(left, mid+1, right); + } + pthread_exit(0); +} + +void merge(int left, int mid, int right) +{ + int i, left_end, num_elements, temp_pos; + + left_end = mid - 1; + temp_pos = left; + num_elements = right - left + 1; + + while ((left <= left_end) && (mid <= right)) + { + if (numbers[left] <= numbers[mid]) + { + temp[temp_pos] = numbers[left]; + temp_pos = temp_pos + 1; + left = left +1; + } + else + { + temp[temp_pos] = numbers[mid]; + temp_pos = temp_pos + 1; + mid = mid + 1; + } + } + + while (left <= left_end) + { + temp[temp_pos] = numbers[left]; + left = left + 1; + temp_pos = temp_pos + 1; + } + while (mid <= right) + { + temp[temp_pos] = numbers[mid]; + mid = mid + 1; + temp_pos = temp_pos + 1; + } + + for (i=0; i <= num_elements; i++) + { + numbers[right] = temp[right]; + right = right - 1; + } +} + + +main() +{ + freopen("data.in", "r", stdin); + freopen("data.out", "w", stdout); + int n; + scanf("%d", &n); + for(int i = 0; i < n; i++) scanf("%d", numbers + i); + + mergeSort(n); + + for(int i = 0; i < n; i++) printf("%d ", numbers[i]); + exit(0); +} diff --git a/MergesortSingle b/MergesortSingle new file mode 100755 index 0000000..4cc3aca Binary files /dev/null and b/MergesortSingle differ diff --git a/MergesortSingle.c b/MergesortSingle.c new file mode 100644 index 0000000..f04bf1c --- /dev/null +++ b/MergesortSingle.c @@ -0,0 +1,84 @@ +#include "cse356header.h" + +void m_sort(int numbers[], int temp[], int left, int right); +void merge(int numbers[], int temp[], int left, int mid, int right); + +void mergeSort(int numbers[], int temp[], int array_size) +{ + m_sort(numbers, temp, 0, array_size - 1); +} + + +void m_sort(int numbers[], int temp[], int left, int right) +{ + int mid; + + if (right > left) + { + mid = (right + left) / 2; + m_sort(numbers, temp, left, mid); + m_sort(numbers, temp, mid+1, right); + + merge(numbers, temp, left, mid+1, right); + } +} + +void merge(int numbers[], int temp[], int left, int mid, int right) +{ + int i, left_end, num_elements, tmp_pos; + + left_end = mid - 1; + tmp_pos = left; + num_elements = right - left + 1; + + while ((left <= left_end) && (mid <= right)) + { + if (numbers[left] <= numbers[mid]) + { + temp[tmp_pos] = numbers[left]; + tmp_pos = tmp_pos + 1; + left = left +1; + } + else + { + temp[tmp_pos] = numbers[mid]; + tmp_pos = tmp_pos + 1; + mid = mid + 1; + } + } + + while (left <= left_end) + { + temp[tmp_pos] = numbers[left]; + left = left + 1; + tmp_pos = tmp_pos + 1; + } + while (mid <= right) + { + temp[tmp_pos] = numbers[mid]; + mid = mid + 1; + tmp_pos = tmp_pos + 1; + } + + for (i=0; i <= num_elements; i++) + { + numbers[right] = temp[right]; + right = right - 1; + } +} + +int data[1000000], tmp[1000000]; + +main() +{ + freopen("data.in", "r", stdin); + freopen("data.out", "w", stdout); + int n; + scanf("%d", &n); + for(int i = 0; i < n; i++) scanf("%d", data + i); + + mergeSort(data, tmp, n); + + for(int i = 0; i < n; i++) printf("%d ", data[i]); + exit(0); +} diff --git a/data.in b/data.in new file mode 100644 index 0000000..42b1c38 --- /dev/null +++ b/data.in @@ -0,0 +1 @@ +5 3 1 2 0 4 diff --git a/makefile b/makefile index aaefaf2..ac3fd1f 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,4 @@ -all: MyCopy ForkCopy PipeCopy timer MyShell MoreShell DupShell +all: MyCopy ForkCopy PipeCopy timer MyShell MoreShell DupShell MergesortSingle MergesortMulti clear: rm *.o MyCopy: MyCopy.o @@ -29,3 +29,12 @@ DupShell: DupShell.o g++ DupShell.o -o DupShell DupShell.o: g++ -c DupShell.c +MergesortSingle: MergesortSingle.o + g++ MergesortSingle.o -o MergesortSingle +MergesortSingle.o: + g++ -c MergesortSingle.c +MergesortMulti: MergesortMulti.o + g++ -lpthread MergesortMulti.o -o MergesortMulti +MergesortMulti.o: + g++ -c MergesortMulti.c +