Advertisement
Ladies_Man

3_5 Merge Sequences (слияние последовательностей приор)

Jan 11th, 2014
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. int *array;
  6. int res, rep = 100, l = 0;
  7. int extra = INT_MAX - 1;
  8.  
  9. struct element {
  10.         int value;
  11.         int index;
  12.         int mass_index;
  13. };
  14.  
  15. struct queue {
  16.         struct element *data;
  17.         int cap;
  18.         int qcount;
  19. } turn;
  20.  
  21. void initelem (int n, int b)
  22. {
  23.     int i;
  24.     for (i = 0; i < n; i++) {
  25.         turn.data[i].index = b;
  26.         turn.data[i].mass_index = i;
  27.     }
  28. }
  29.  
  30. void initqueue (int size, int val)
  31. {
  32.     turn.data = (struct element*)malloc(size * sizeof(struct element));
  33.     turn.cap = size;
  34.     turn.qcount = size;
  35.     initelem (size, val);
  36. }
  37.  
  38. void swap(int a, int b)
  39. {
  40.         struct element elem = turn.data[a];
  41.         turn.data[a] = turn.data[b];
  42.         turn.data[b] = elem;
  43. }
  44.  
  45. void heapify (int i, int n)
  46. {
  47.     int ind = 0;
  48.     while (ind >= 0) {
  49.         int l = 2*i + 1, r = l + 1, j = i;
  50.         if (l < n && turn.data[l].value < turn.data[i].value)
  51.             i = l;
  52.         if (r < n && turn.data[r].value < turn.data[i].value)
  53.             i = r;
  54.         if (i == j) break;
  55.         ind++;
  56.         swap (i, j);
  57.     }
  58. }
  59.  
  60. int extmax (int n)
  61. {
  62.     //struct queue turn;
  63.     if (0 > turn.qcount) {
  64.         printf("devastation\n");
  65.         return -1;
  66.     }
  67.     else {
  68.         swap (0, turn.qcount);
  69.         turn.data[turn.qcount].index++;
  70.         heapify (0, turn.qcount);
  71.         return 1;
  72.     }
  73. }
  74.  
  75. void inckey (int i)
  76. {
  77.     while (i > 0 && turn.data[(i - 1) / 2].value > turn.data[i].value) {
  78.         swap ((i - 1) / 2, i);
  79.         i = (i - 1) / 2;
  80.     }
  81. }
  82.  
  83. void insert(int k, int *length, int **a)
  84. {
  85.         array[l++] = turn.data[0].value;
  86.         turn.qcount--;
  87.         if (extmax (k) && turn.data[turn.qcount].index != length[turn.data[turn.qcount].mass_index]) {
  88.                 int i = turn.qcount;
  89.                 int j = a[turn.data[turn.qcount].mass_index][turn.data[turn.qcount].index];
  90.                 turn.data[turn.qcount].value = j;
  91.                 turn.qcount++;
  92.                 inckey (i);
  93.         }
  94. }
  95.  
  96. void buildheap (int n)
  97. {
  98.     int i = (n / 2) - 1;
  99.     while (i >= 0) {
  100.         heapify(i, n);
  101.         i--;
  102.     }
  103. }
  104.  
  105. void heap_build_print (int n, int *length, int **el)
  106. {
  107.     //buildheap (n);
  108.     int i = (n / 2) - 1;
  109.     while (i >= 0) {
  110.         heapify(i--, n);
  111.     }
  112.     i = n - 1;
  113.     while (0 != turn.qcount) {
  114.         insert (n, length, el);
  115.         i--;
  116.     }
  117.     for (i = 0; i < res; i++) {
  118.         if ((INT_MAX - 1) == array[i]) continue;
  119.         else printf("%d ", array[i]);
  120.     }
  121. }
  122.  
  123. int main()
  124. {
  125.         int final_size = 0, i = 0, j, k;
  126.         int *length, **a;
  127.         scanf("%d", &k);
  128.  
  129.         initqueue (k, i);
  130.         length = (int*)malloc(k * sizeof(int));
  131.         a = malloc(k * sizeof(int*));
  132.  
  133.         for (i = 0; i < k; i++) {
  134.                 scanf("%d", &length[i]);
  135.                 if (0 == length[i]) length[i] = rep;
  136.                 final_size += length[i];
  137.                 a[i] = malloc(sizeof(int) * length[i]);
  138.                 if (i + 1 == k) res = final_size;
  139.         }
  140.         array = (int*)malloc(sizeof(int) * res);
  141.        
  142.         for (i = 0; i < k; i++) {
  143.             if (rep != length[i]) {
  144.                 for (j = 0; j < length[i]; j++)
  145.                 scanf ("%d", &a[i][j]);
  146.                 turn.data[i].value = a[i][0];
  147.             }
  148.             else {
  149.                 for (j = 0; j < length[i]; j++)
  150.                 a[i][j] = extra;
  151.                 turn.data[i].value = a[i][0];
  152.             }
  153.         }
  154.  
  155.         heap_build_print(k, length, a);
  156.  
  157.         //mem-salvation
  158.         for (i = 0; i < k; i++)
  159.         free(a[i]);
  160.         free(a);
  161.         free(array);
  162.         free(length);
  163.         free(turn.data);
  164.         return 0;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement