Skip to content
Snippets Groups Projects
Commit 3d6f3c69 authored by steffeno's avatar steffeno
Browse files

mergesort

parent e4023fc0
No related branches found
No related tags found
No related merge requests found
......@@ -41,10 +41,12 @@ void upo_insertion_sort(void *base, size_t n, size_t size, upo_sort_comparator_t
void upo_merge_sort(void *base, size_t n, size_t size, upo_sort_comparator_t cmp)
{
/* TO STUDENTS:
* Remove the following two lines and put here your implementation. */
fprintf(stderr, "To be implemented!\n");
abort();
if (n > 1) {
void *base2 = (unsigned char *)base + (n / 2) * size;
upo_merge_sort(base, n / 2, size, cmp);
upo_merge_sort(base2, n - (n / 2), size, cmp);
upo_merge_sort_merge(base, n / 2, base2, n - (n / 2), size, cmp);
}
}
void upo_quick_sort(void *base, size_t n, size_t size, upo_sort_comparator_t cmp)
......
#include <assert.h>
#include "sort_private.h"
#include <stdlib.h>
#include <string.h>
void *upo_insertion_sort_insert_pos(
const void *base,
......@@ -17,3 +19,42 @@ void *upo_insertion_sort_insert_pos(
// unreachable
assert(0);
}
void upo_merge_sort_merge(void *base1, size_t n1, void *base2, size_t n2, size_t size, upo_sort_comparator_t cmp)
{
unsigned char *tmp = malloc((n1 + n2) * size);
size_t i1 = 0;
size_t i2 = 0;
while (i1 < n1 && i2 < n2) {
unsigned char *curr1 = (unsigned char *)base1 + i1 * size;
unsigned char *curr2 = (unsigned char *)base2 + i2 * size;
unsigned char *currtmp = tmp + (i1 + i2) * size;
if (cmp(curr1, curr2) < 0) {
memcpy(currtmp, curr1, size);
++i1;
} else {
memcpy(currtmp, curr2, size);
++i2;
}
}
while (i1 < n1) {
unsigned char *curr = (unsigned char *)base1 + i1 * size;
unsigned char *currtmp = tmp + (i1 + i2) * size;
memcpy(currtmp, curr, size);
++i1;
}
while (i2 < n2) {
unsigned char *curr = (unsigned char *)base2 + i2 * size;
unsigned char *currtmp = tmp + (i1 + i2) * size;
memcpy(currtmp, curr, size);
++i2;
}
memcpy(base1, tmp, n1 * size);
memcpy(base2, tmp + n1 * size, n2 * size);
free(tmp);
}
......@@ -39,6 +39,9 @@ void *upo_insertion_sort_insert_pos(
upo_sort_comparator_t cmp
);
void upo_merge_sort_merge(void *base1, size_t n1, void *base2, size_t n2, size_t size, upo_sort_comparator_t cmp);
/* TO STUDENTS:
*
* This file is currently "empty".
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment