From 57d2fe1409fe334d2767a9b711626577688393d7 Mon Sep 17 00:00:00 2001 From: heimoshuiyu Date: Tue, 13 Apr 2021 19:57:33 +0800 Subject: [PATCH] week6 merge and insertion sort --- week6/T6.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++ week6/T6.h | 27 ++++++++++ 2 files changed, 178 insertions(+) create mode 100644 week6/T6.c create mode 100644 week6/T6.h diff --git a/week6/T6.c b/week6/T6.c new file mode 100644 index 0000000..9d39d45 --- /dev/null +++ b/week6/T6.c @@ -0,0 +1,151 @@ +/* + * Author: Walter + * Student ID: 1930006025 + * Week_6 + * InsertionSort and MergeSort + */ + +#include +#include +#include + +#include "T6.h" + +int main() { + /* size of test data */ + int size = 100000; + + int *A; + clock_t start, end; + + printf("Allocating test data space...\n"); + A = (int *)malloc(sizeof(int) * size); + if (A == NULL) { + printf("Fatal: can not allocate A space\n"); + exit(1); + } + + printf("Generating random integer...\n"); + for (int i = 0; i < size; i++) { + A[i] = rand(); + } + + printf("Testing merge sort...\n"); + start = clock(); + MergeSort(A, 0, size - 1); + end = clock(); + PrintClockInterval(start, end); + + printf("Checking result... %s\n", Check(A, size) ? "pass" : "fail"); + + printf("Generating random integer...\n"); + for (int i = 0; i < size; i++) { + A[i] = rand(); + } + + printf("Testing insertion sort...\n"); + start = clock(); + InsertionSort(A, size); + end = clock(); + PrintClockInterval(start, end); + + printf("Checking result... %s\n", Check(A, size) ? "pass" : "fail"); + + return 0; +} + +bool Check(int *A, int size) { + if (size == 1) { + return true; + } + for (int i = 0; i < size - 1; i++) { + if (A[i] > A[i + 1]) { + /* if found, return immeditily */ + return false; + } + } + return true; +} + +void MergeSort(int *A, int left, int right) { + /* alloce space */ + int *tmp = (int *)malloc(sizeof(int) * (right - left + 1)); + if (tmp == NULL) { + printf("Fatal: can not allocate space\n"); + exit(1); + } + + /* real merge function */ + _MergeSort(A, tmp, left, right); + + free(tmp); +} + +void _MergeSort(int *A, int *tmp, int left, int right) { + int center; + if (left < right) { + center = (left + right) / 2; + _MergeSort(A, tmp, left, center); + _MergeSort(A, tmp, center + 1, right); + Merge(A, tmp, left, center + 1, right); + } +} + +void Merge(int *A, int *tmp, int lpos, int rpos, int rightEnd) { + int i, leftEnd, num, tmpPos; + + /* lpos -> leftEnd -> rpos -> rightEnd */ + leftEnd = rpos - 1; + tmpPos = lpos; + num = rightEnd - lpos + 1; + + /* main loop */ + while (lpos <= leftEnd && rpos <= rightEnd) { + if (A[lpos] <= A[rpos]) { + tmp[tmpPos++] = A[lpos++]; + } else { + tmp[tmpPos++] = A[rpos++]; + } + } + + /* copy rest of first half */ + while (lpos <= leftEnd) { + tmp[tmpPos++] = A[lpos++]; + } + /* copy rest of second half */ + while (rpos <= rightEnd) { + tmp[tmpPos++] = A[rpos++]; + } + + /* copy tmp array back */ + for (i = 0; i < num; i++, rightEnd--) { + A[rightEnd] = tmp[rightEnd]; + } +} + +void InsertionSort(int *A, int n) { + int j, p; + + int tmp; + + /* loop of p from 1 to n */ + for (p = 1; p < n; p++) { + + /* store A[p] */ + tmp = A[p]; + + /* loop of j from p to 0 or + * until A[j-1] <= A[p] */ + for (j = p; j > 0 && A[j - 1] > tmp; j--) { + /* move */ + A[j] = A[j - 1]; + } + + /* insert tmp to right position */ + A[j] = tmp; + } +} + +void PrintClockInterval(clock_t start, clock_t end) { + printf("Time cost is %ld ms\n", (end - start) / (CLOCKS_PER_SEC / 1000)); +} diff --git a/week6/T6.h b/week6/T6.h new file mode 100644 index 0000000..891fcbc --- /dev/null +++ b/week6/T6.h @@ -0,0 +1,27 @@ +/* + * Author: Walter + * Student ID: 1930006025 + * Week_6 + * InsertionSort and MergeSort + */ + +#include +#include + +/* insertion sort array A, with size n */ +void InsertionSort(int *A, int n); + +/* merge sort array A, start at left, end at right */ +void MergeSort(int *A, int left, int right); + +/* real merge sort function */ +void _MergeSort(int *A, int *tmp, int left, int right); + +/* merge function used in merge short */ +void Merge(int *A, int *tmp, int lpos, int rpos, int rend); + +/* check a sorted array */ +bool Check(int *A, int size); + +/* print one line to stdout about interval in ms */ +void PrintClockInterval(clock_t start, clock_t end);