Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.15 KB | None | 0 0
  1. // Merge sort was taken from https://www.geeksforgeeks.org/c-program-for-merge-sort/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <limits.h>
  6.  
  7. struct Pair
  8. {
  9.     int key;
  10.     int value;
  11. };
  12.  
  13. void merge(struct Pair* data, size_t left,
  14. size_t center, size_t right) {
  15.     struct Pair left_arr[center - left + 1];
  16.     struct Pair right_arr[right - center];
  17.  
  18.     for (size_t i = 0; i < center - left + 1; ++i) {
  19.         left_arr[i].key = data[left + i].key;
  20.         left_arr[i].value = data[left + i].key;
  21.     }
  22.     for (size_t i = 0; i < right - center; ++i) {
  23.         right_arr[i].key = data[center + i + 1].key;
  24.         right_arr[i].value = data[center + i + 1].value;
  25.     }
  26.  
  27.     size_t i = 0, j = 0;
  28.     while (i < center - left + 1 && j < right - center) {
  29.         if (left_arr[i].key <= right_arr[i].key) {
  30.             data[center].key = left_arr[i].key;
  31.             data[center].value = left_arr[i].value;
  32.             ++i;
  33.         } else {
  34.             data[center].key = right_arr[j].key;
  35.             data[center].value = right_arr[j].value;
  36.             ++j;
  37.         }
  38.         ++center;
  39.     }
  40.     while (i < center - left + 1) {
  41.         data[center].key = left_arr[i].key;
  42.         data[center].value = left_arr[i].value;
  43.         ++center;
  44.         ++i;
  45.     }
  46.     while (j < right - center) {
  47.         data[center].key = right_arr[j].key;
  48.         data[center].value = right_arr[j].value;
  49.         ++center;
  50.         ++j;
  51.     }
  52. }
  53.  
  54. void merge_sort(struct Pair *data, size_t left, size_t right) {
  55.     if (left < right) {
  56.         size_t center = left + (right - left) / 2;
  57.         merge_sort(data, left, center);
  58.         merge_sort(data, center + 1, right);
  59.         merge(data, left, center, right);
  60.     }
  61. }
  62.  
  63. void process(struct Pair *data, size_t size) {
  64.     if (size == 0) return;
  65.     merge_sort(data, 0, size - 1);
  66. }
  67.  
  68. int main() {
  69.     size_t n;
  70.     struct Pair data[10];
  71.     scanf("%lu", &n);
  72.     for (size_t i = 0; i < n; ++i)
  73.         scanf("%d %d", &data[i].key, &data[i].value);
  74.     process(data, n);
  75.     for (size_t i = 0; i < n; ++i)
  76.         printf("key: %d; value: %d\n", data[i].key, data[i].value);
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement