Skip to content

Commit 5b718b9

Browse files
committed
🎉
1 parent 81ed92b commit 5b718b9

File tree

15 files changed

+272
-402
lines changed

15 files changed

+272
-402
lines changed

Diff for: IP-Finals/2017resit/problem3/prob3.c

+29-38
Original file line numberDiff line numberDiff line change
@@ -16,47 +16,38 @@ void *safeMalloc (int n) {
1616
return ptr;
1717
}
1818

19-
int *copySubArray(int left, int right, int arr[]) {
20-
int i, *copy = safeMalloc((right - left)*sizeof(int));
21-
for (i=left; i < right; i++) {
19+
int *copySubArray(int *arr, int left, int right) {
20+
/* copies the subarray arr[left..right] into a new array */
21+
int *copy = safeMalloc((right - left) * sizeof(int));
22+
for (int i = left; i < right; i++)
2223
copy[i - left] = arr[i];
23-
}
2424
return copy;
2525
}
2626

27-
void mergeSort(int length, int arr[]) {
28-
int l, r, mid, idx, *left, *right;
29-
if (length <= 1) {
30-
return;
31-
}
32-
mid = length/2;
33-
left = copySubArray(0, mid, arr);
34-
right = copySubArray(mid, length, arr);
35-
mergeSort(mid, left);
36-
mergeSort(length - mid, right);
37-
idx = 0;
38-
l = 0;
39-
r = 0;
40-
while ((l < mid) && (r < length - mid)) {
41-
if (left[l] < right[r]) {
42-
arr[idx] = left[l];
43-
l++;
44-
} else {
45-
arr[idx] = right[r];
46-
r++;
47-
}
48-
idx++;
49-
}
50-
while (l < mid) {
51-
arr[idx] = left[l];
52-
idx++;
53-
l++;
54-
}
55-
while (r < length - mid) {
56-
arr[idx] = right[r];
57-
idx++;
58-
r++;
27+
void mergeSort(int *arr, int length) {
28+
/* sorts an array of integers in O(n log n) time */
29+
int l = 0, r = 0, idx = 0, mid = length/2;
30+
if (length <= 1) return;
31+
32+
int *left = copySubArray(arr, 0, mid);
33+
int *right = copySubArray(arr, mid, length);
34+
35+
mergeSort(left, mid);
36+
mergeSort(right, length - mid);
37+
38+
while (l < mid && r < length - mid) {
39+
if (left[l] < right[r])
40+
arr[idx++] = left[l++];
41+
else
42+
arr[idx++] = right[r++];
5943
}
44+
45+
while (l < mid)
46+
arr[idx++] = left[l++];
47+
48+
while (r < length - mid)
49+
arr[idx++] = right[r++];
50+
6051
free(left);
6152
free(right);
6253
}
@@ -74,8 +65,8 @@ int main(int argc, char *argv[]) {
7465
(void)! scanf("%d", &n);
7566
int *arr1 = readInput(n);
7667
int *arr2 = readInput(n);
77-
mergeSort(n, arr1);
78-
mergeSort(n, arr2);
68+
mergeSort(arr1, n);
69+
mergeSort(arr2, n);
7970
for (int i=0; i < n; ++i) {
8071
if (arr1[i] != arr2[i]) {
8172
printf("NO\n");

Diff for: IP-Finals/2018/problem3/prob3-1.c

+28-37
Original file line numberDiff line numberDiff line change
@@ -26,47 +26,38 @@ void* safeRealloc(void* ptr, int n) {
2626
return ptr;
2727
}
2828

29-
int *copySubArray(int left, int right, int arr[]) {
30-
int i, *copy = safeMalloc((right - left)*sizeof(int));
31-
for (i=left; i < right; i++) {
29+
int *copySubArray(int *arr, int left, int right) {
30+
/* copies the subarray arr[left..right] into a new array */
31+
int *copy = safeMalloc((right - left) * sizeof(int));
32+
for (int i = left; i < right; i++)
3233
copy[i - left] = arr[i];
33-
}
3434
return copy;
3535
}
3636

37-
void mergeSort(int length, int arr[]) {
38-
int l, r, mid, idx, *left, *right;
39-
if (length <= 1) {
40-
return;
41-
}
42-
mid = length/2;
43-
left = copySubArray(0, mid, arr);
44-
right = copySubArray(mid, length, arr);
45-
mergeSort(mid, left);
46-
mergeSort(length - mid, right);
47-
idx = 0;
48-
l = 0;
49-
r = 0;
50-
while ((l < mid) && (r < length - mid)) {
51-
if (left[l] < right[r]) {
52-
arr[idx] = left[l];
53-
l++;
54-
} else {
55-
arr[idx] = right[r];
56-
r++;
57-
}
58-
idx++;
59-
}
60-
while (l < mid) {
61-
arr[idx] = left[l];
62-
idx++;
63-
l++;
64-
}
65-
while (r < length - mid) {
66-
arr[idx] = right[r];
67-
idx++;
68-
r++;
37+
void mergeSort(int *arr, int length) {
38+
/* sorts an array of integers in O(n log n) time */
39+
int l = 0, r = 0, idx = 0, mid = length/2;
40+
if (length <= 1) return;
41+
42+
int *left = copySubArray(arr, 0, mid);
43+
int *right = copySubArray(arr, mid, length);
44+
45+
mergeSort(left, mid);
46+
mergeSort(right, length - mid);
47+
48+
while (l < mid && r < length - mid) {
49+
if (left[l] < right[r])
50+
arr[idx++] = left[l++];
51+
else
52+
arr[idx++] = right[r++];
6953
}
54+
55+
while (l < mid)
56+
arr[idx++] = left[l++];
57+
58+
while (r < length - mid)
59+
arr[idx++] = right[r++];
60+
7061
free(left);
7162
free(right);
7263
}
@@ -107,7 +98,7 @@ int main(int argc, char **argv){
10798
int size=10, target;
10899
(void)! scanf("%d\n", &target);
109100
int *vec = readIntVector(&size);
110-
mergeSort(size, vec);
101+
mergeSort(vec, size);
111102
getPairs(vec, size, target);
112103
free(vec);
113104
return 0;

Diff for: IP-Finals/2018resit/problem3/prob3-1.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ int bubbleCount(int *arr, int len) {
5353
++count;
5454
}
5555
}
56-
if (change == 0) break;
56+
if (!change) break;
5757
}
5858
return count;
5959
}

Diff for: IP-Finals/2018resit/problem3/prob3-2.c

+30-40
Original file line numberDiff line numberDiff line change
@@ -21,53 +21,43 @@ void *safeMalloc (int n) {
2121
return ptr;
2222
}
2323

24-
int *copySubArray(int left, int right, int arr[]) {
25-
int i, *copy = safeMalloc((right - left)*sizeof(int));
26-
for (i=left; i < right; i++) {
24+
int *copySubArray(int *arr, int left, int right) {
25+
/* copies the subarray arr[left..right] into a new array */
26+
int *copy = safeMalloc((right - left)*sizeof(int));
27+
for (int i = left; i < right; i++)
2728
copy[i - left] = arr[i];
28-
}
2929
return copy;
3030
}
3131

32-
int mergeSort(int length, int arr[]) {
33-
int l, r, mid, idx, *left, *right;
34-
if (length <= 1) {
35-
return 0;
36-
}
37-
mid = length/2;
38-
left = copySubArray(0, mid, arr);
39-
right = copySubArray(mid, length, arr);
40-
int count = mergeSort(mid, left);
41-
count += mergeSort(length - mid, right);
42-
idx = 0;
43-
l = 0;
44-
r = 0;
45-
while ((l < mid) && (r < length - mid)) {
46-
if (left[l] <= right[r]) {
47-
// no inversions in this case
48-
arr[idx] = left[l];
49-
l++;
50-
} else {
51-
// total number of inversions to add is the number of
52-
// elements currently left in the left array: mid - l
53-
arr[idx] = right[r];
54-
r++; count += mid - l;
32+
int countInversions(int *arr, int length) {
33+
/* sorts an array of integers in O(n log n) time */
34+
int l = 0, r = 0, idx = 0, mid = length/2, count = 0;
35+
if (length <= 1) return 0;
36+
37+
int *left = copySubArray(arr, 0, mid);
38+
int *right = copySubArray(arr, mid, length);
39+
40+
count += countInversions(left, mid);
41+
count += countInversions(right, length - mid);
42+
43+
while (l < mid && r < length - mid) {
44+
if (left[l] <= right[r]) // no inversions in this case
45+
arr[idx++] = left[l++];
46+
else { // total number of inversions to add
47+
arr[idx++] = right[r++]; // is the number of elements currently
48+
count += mid - l; // left in the left subarray: mid - l
5549
}
56-
idx++;
57-
}
58-
while (l < mid) {
59-
arr[idx] = left[l];
60-
idx++;
61-
l++;
62-
}
63-
while (r < length - mid) {
64-
arr[idx] = right[r];
65-
idx++;
66-
r++;
6750
}
51+
52+
while (l < mid)
53+
arr[idx++] = left[l++];
54+
55+
while (r < length - mid)
56+
arr[idx++] = right[r++];
57+
6858
free(left);
6959
free(right);
70-
return count;
60+
return count;
7161
}
7262

7363
int *readIntVector (int size) {
@@ -81,7 +71,7 @@ int main(int argc, char **argv){
8171
int size;
8272
(void)! scanf("%d\n", &size);
8373
int *vect = readIntVector(size);
84-
printf("%d\n", mergeSort(size, vect));
74+
printf("%d\n", countInversions(vect, size));
8575
free(vect);
8676
return 0;
8777
}

Diff for: IP-Finals/2019/problem4/prob4-1.c

+28-38
Original file line numberDiff line numberDiff line change
@@ -26,48 +26,38 @@ void createArray (int **arr, int len) {
2626
*arr = safeCalloc(len, sizeof(int));
2727
}
2828

29-
int *copySubArray(int left, int right, int arr[]) {
30-
int i, *copy;
31-
copy = safeCalloc((right - left), sizeof(int));
32-
for (i=left; i < right; i++) {
29+
int *copySubArray(int *arr, int left, int right) {
30+
/* copies the subarray arr[left..right] into a new array */
31+
int *copy = safeCalloc((right - left), sizeof(int));
32+
for (int i = left; i < right; i++)
3333
copy[i - left] = arr[i];
34-
}
3534
return copy;
3635
}
3736

38-
void mergeSort(int length, int arr[]) {
39-
int l, r, mid, idx, *left, *right;
40-
if (length <= 1) {
41-
return;
42-
}
43-
mid = length/2;
44-
left = copySubArray(0, mid, arr);
45-
right = copySubArray(mid, length, arr);
46-
mergeSort(mid, left);
47-
mergeSort(length - mid, right);
48-
idx = 0;
49-
l = 0;
50-
r = 0;
51-
while ((l < mid) && (r < length - mid)) {
52-
if (left[l] < right[r]) {
53-
arr[idx] = left[l];
54-
l++;
55-
} else {
56-
arr[idx] = right[r];
57-
r++;
58-
}
59-
idx++;
60-
}
61-
while (l < mid) {
62-
arr[idx] = left[l];
63-
idx++;
64-
l++;
65-
}
66-
while (r < length - mid) {
67-
arr[idx] = right[r];
68-
idx++;
69-
r++;
37+
void mergeSort(int *arr, int length) {
38+
/* sorts an array of integers in O(n log n) time */
39+
int l = 0, r = 0, idx = 0, mid = length/2;
40+
if (length <= 1) return;
41+
42+
int *left = copySubArray(arr, 0, mid);
43+
int *right = copySubArray(arr, mid, length);
44+
45+
mergeSort(left, mid);
46+
mergeSort(right, length - mid);
47+
48+
while (l < mid && r < length - mid) {
49+
if (left[l] < right[r])
50+
arr[idx++] = left[l++];
51+
else
52+
arr[idx++] = right[r++];
7053
}
54+
55+
while (l < mid)
56+
arr[idx++] = left[l++];
57+
58+
while (r < length - mid)
59+
arr[idx++] = right[r++];
60+
7161
free(left);
7262
free(right);
7363
}
@@ -104,7 +94,7 @@ int main(int argc, char *argv[]) {
10494
createArray (&sorted, n);
10595
processInput (series, sorted, n);
10696

107-
mergeSort (n, sorted);
97+
mergeSort (sorted, n);
10898
printArray (series, sorted, n, k);
10999
free(series);
110100
free(sorted);

0 commit comments

Comments
 (0)