Advertisement
ZOOOO

Untitled

Jan 27th, 2016
3,475
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. //слияние последовательнсотей
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5.  
  6. struct Elem {
  7. int arr_n;
  8. int arr_pos;
  9. int v;
  10. };
  11.  
  12. typedef struct Elem Elem;
  13.  
  14. int cmp(Elem a, Elem b) {
  15. return b.v - a.v;
  16. }
  17.  
  18. struct PQ {
  19. Elem *heap;
  20. int cap;
  21. int count;
  22. };
  23.  
  24. typedef struct PQ PQ;
  25.  
  26. PQ *initPQ(int n) {
  27. PQ *q = malloc(sizeof(PQ));
  28. q->heap = malloc(sizeof(Elem) * n);
  29. q->cap = n;
  30. q->count = 0;
  31. return q;
  32. }
  33.  
  34. void freePQ(PQ *q) {
  35. free(q->heap);
  36. free(q);
  37. }
  38.  
  39. void addPQ(PQ *q, Elem n) {
  40. int i = q->count;
  41. if (q->count == q->cap)
  42. perror("overflow");
  43. q->count = i + 1;
  44. q->heap[i] = n;
  45. while (i > 0 && cmp(q->heap[(i - 1) / 2], q->heap[i]) < 0) {
  46. Elem tmp = q->heap[(i - 1) / 2];
  47. q->heap[(i - 1) / 2] = q->heap[i];
  48. q->heap[i] = tmp;
  49. i = (i - 1) / 2;
  50. }
  51. }
  52.  
  53. void heapify(int i, int n, Elem *heap) {
  54. while (1) {
  55. int l = 2 * i;
  56. int r = l + 1;
  57. int j = i;
  58. if (l < n && cmp(heap[i], heap[l]) < 0)
  59. i = l;
  60. if (r < n && cmp(heap[i], heap[r]) < 0)
  61. i = r;
  62. if (i == j)
  63. break;
  64. Elem tmp = heap[i];
  65. heap[i] = heap[j];
  66. heap[j] = tmp;
  67. }
  68. }
  69.  
  70. Elem popPQ(PQ *q) {
  71. if (q->count == 0)
  72. perror("empty");
  73. Elem p = q->heap[0];
  74. q->count--;
  75. if (q->count > 0) {
  76. q->heap[0] = q->heap[q->count];
  77. heapify(0, q->count, q->heap);
  78. }
  79. return p;
  80. }
  81.  
  82. int emptyPQ(PQ *q) {
  83. return q->count == 0;
  84. }
  85.  
  86. int main(int argc, char **argv) {
  87. int n;
  88. scanf("%d", &n);
  89. int dims[n];
  90. int *arrs[n];
  91. for (int i = 0; i < n; i++) {
  92. scanf("%d", &dims[i]);
  93. arrs[i] = malloc(sizeof(int) * dims[i]);
  94. }
  95. PQ *q = initPQ(n);
  96. for (int i = 0; i < n; i++)
  97. if (dims[i]) {
  98. for (int k = 0; k < dims[i]; k++)
  99. scanf("%d", &arrs[i][k]);
  100. addPQ(q, (Elem) { i, 0, arrs[i][0] });
  101. }
  102. while(!emptyPQ(q)) {
  103. Elem m = popPQ(q);
  104. printf("%d ", m.v);
  105. if(++m.arr_pos < dims[m.arr_n]) {
  106. m.v = arrs[m.arr_n][m.arr_pos];
  107. addPQ(q, m);
  108. }
  109. }
  110. for (int i = 0; i < n; i++)
  111. free(arrs[i]);
  112. freePQ(q);
  113. return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement