Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. #include <stddef.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4.  
  5. int comparator(const void *left, const void *right) {
  6. //assert(left != NULL);
  7. //assert(right != NULL);
  8. return *((const int *) left) - *((const int *) right);
  9. }
  10.  
  11.  
  12. void mergesort(void *array, size_t elements, size_t element_size ,int (*comparator)(const void *, const void *)) {
  13. size_t mid;
  14. size_t l = 0;
  15. size_t r = elements;
  16. if (l == r - 1) {
  17. return;
  18. }
  19. mid = ((l + r) / 2);
  20. size_t first = l;
  21. size_t second = mid;
  22. mergesort(array, mid - l, element_size, comparator);
  23. mergesort(array + mid * element_size, r - mid, element_size, comparator);
  24. void *dop = (void *) malloc((elements + 5) * element_size);
  25.  
  26. for (int i = 0; i < elements; i++) {
  27. if (second < r && comparator(array + first * element_size, array + second * element_size) <= 0 && first < mid) {
  28. memcpy(dop + i * element_size, array + first * element_size, element_size);
  29. first ++;
  30. } else {
  31. if (second < r) {
  32. memcpy(dop + i * element_size, array + second * element_size, element_size);
  33. second ++;
  34. } else {
  35. memcpy(dop + i * element_size, array + first * element_size, element_size);
  36. first ++;
  37. }
  38. }
  39. }
  40.  
  41. for (int i = 0; i < elements; i++) {
  42. memcpy(array + l * element_size + i * element_size, dop + i * element_size, element_size);
  43. }
  44. free(dop);
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement