From d9790182c8192aee50e1a687aa1dac1ca67d4c01 Mon Sep 17 00:00:00 2001 From: heimoshuiyu Date: Wed, 28 Apr 2021 22:02:17 +0800 Subject: [PATCH] week9 heapsort and quicksort compare --- week9/T8.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++ week9/T8.h | 16 ++++++++ 2 files changed, 129 insertions(+) create mode 100644 week9/T8.c create mode 100644 week9/T8.h diff --git a/week9/T8.c b/week9/T8.c new file mode 100644 index 0000000..f73ce0c --- /dev/null +++ b/week9/T8.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include + +#include "T8.h" + +int main() { + int size = 5000000; + clock_t start_time, end_time; + + int *A1 = (int *)malloc(sizeof(int) * size); + if (A1 == NULL) { + printf("Fatal: Can not allocate memory of A1 with size=%d\n", size); + exit(1); + } + + int *A2 = (int *)malloc(sizeof(int) * size); + if (A2 == NULL) { + printf("Fatal: Can not allocate memory of A2 with size=%d\n", size); + exit(1); + } + + /* generate random number */ + for (int i = 0; i < size; i++) { + A1[i] = A2[i] = rand(); + } + + printf("Testing HeapSort function ... "); + start_time = clock(); + HeapSort(A1, size); + end_time = clock(); + printf("%s\n", Check(A1, size) ? "pass" : "failed"); + PrintTimeDuration(start_time, end_time); + + printf("Testing QuickSort function ... "); + start_time = clock(); + QuickSort(A2, 0, size - 1); + end_time = clock(); + printf("%s\n", Check(A1, size) ? "pass" : "failed"); + PrintTimeDuration(start_time, end_time); + + return 0; +} + +bool Check(int *A, int size) { + for (int i = 0; i < size - 1; i++) { + if (A[i] > A[i + 1]) { + return false; + } + } + return true; +} + +void QuickSort(int *A, int left, int right) { + if (left >= right) { + return; + } + int pi = Partition(A, left, right); + QuickSort(A, left, pi - 1); + QuickSort(A, pi + 1, right); +} + +int Partition(int *A, int left, int right) { + int pivot = A[right]; + int i = left - 1; + for (int j = left; j < right; j++) { + if (A[j] < pivot) { + Swap(&A[++i], &A[j]); + } + } + Swap(&A[++i], &A[right]); + return i; +} + +void HeapSort(int *A, int n) { + int i; + for (i = n / 2; i >= 0; i--) { + PercDown(A, i, n); + } + for (i = n - 1; i > 0; i--) { + Swap(&A[0], &A[i]); + PercDown(A, 0, i); + } +} + +void PercDown(int *A, int i, int n) { + int child, tmp; + + for (tmp = A[i]; (2 * i + 1) < n; i = child) { + child = 2 * i + 1; + if (child != n - 1 && A[child + 1] > A[child]) { + child++; + } + if (tmp < A[child]) { + A[i] = A[child]; + } else { + break; + } + } + A[i] = tmp; +} + +void Swap(int *a, int *b) { + int tmp = *a; + *a = *b; + *b = tmp; +} + +void PrintTimeDuration(clock_t start_time, clock_t end_time) { + printf("Time cost: %ld ms\n", (end_time - start_time) / (CLOCKS_PER_SEC / 1000)); +} + diff --git a/week9/T8.h b/week9/T8.h new file mode 100644 index 0000000..4b3435a --- /dev/null +++ b/week9/T8.h @@ -0,0 +1,16 @@ +#include + + +void QuickSort(int *A, int left, int right); + +int Partition(int *A, int left, int right); + +void HeapSort(int *A, int n); + +void PercDown(int *A, int i, int n); + +bool Check(int *A, int size); + +void Swap(int *a, int *b); + +void PrintTimeDuration(clock_t start_time, clock_t end_time);