-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathMergeSort.c
87 lines (57 loc) · 2.48 KB
/
MergeSort.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include "../Headers/MergeSort.h"
#include "../Headers/SwapFunction.h"
#include "../../../System/Utils.h"
void mergeSortHelper(void *arr, int length, int elemSize, int (*cmp)(const void *, const void *));
/** This function will take an array then it sort it with the merge sort algorithm.
*
* Time Complexity: worst: O( n log(n) ) , best: O ( n log(n) ).
* Space Complexity: O ( log(n) ) <<because the recursive calls>>
*
* @param arr the array pointer
* @param length the length of the array
* @param elemSize the size of the array elements in bytes
* @param cmp the comparator function pointer
*/
void mergeSort(void *arr, int length, int elemSize, int (*cmp)(const void *, const void *)) {
if (arr == NULL) {
fprintf(stderr, NULL_POINTER_MESSAGE, "passed array", "merge sort");
exit(NULL_POINTER);
} else if (cmp == NULL) {
fprintf(stderr, INVALID_ARG_MESSAGE, "comparator function pointer", "merge sort");
exit(INVALID_ARG);
} else if (length < 0) {
fprintf(stderr, INVALID_ARG_MESSAGE, "array length", "merge sort");
exit(INVALID_ARG);
} else if (elemSize <= 0) {
fprintf(stderr, INVALID_ARG_MESSAGE, "element size", "merge sort");
exit(INVALID_ARG);
}
mergeSortHelper(arr, length, elemSize, cmp);
}
/** This function will take an array then it sort it recursively with the merge sort algorithm.
* Note: this function should only be called from the mergeSort function.
*
* Time Complexity: worst: O( n log(n) ) , best: O ( n log(n) ).
* Space Complexity: O ( log(n) ) <<because the recursive calls>>
*
* @param arr the array pointer
* @param length the length of the array
* @param elemSize the size of the array elements in bytes
* @param cmp the comparator function pointer
*/
void mergeSortHelper(void *arr, int length, int elemSize, int (*cmp)(const void *, const void *)) {
if (length <= 0)
return;
int middleLength = (int) (length / 2);
int secondHalfLength = length - middleLength == length ? 0 : length - middleLength;
mergeSortHelper(arr, middleLength, elemSize, cmp);
mergeSortHelper(arr + middleLength * elemSize, secondHalfLength, elemSize, cmp);
for (int i = middleLength - 1; i >= 0; i--) {
for (int j = i; j < length - 1; j++) {
if ( cmp(arr + j * elemSize, arr + (j + 1) * elemSize ) > 0 )
swap(arr + j * elemSize, arr + (j + 1) * elemSize, elemSize);
else
break;
}
}
}