Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <sstream>
  4. #include <functional>
  5. #include <cmath>
  6. #include <time.h>
  7. #include <cstdlib>
  8. //dolaczyc tablice dynamiczna
  9.  
  10. using namespace std;
  11.  
  12. class Person {
  13. public:
  14. string name;
  15. int age;
  16.  
  17. Person(int age, string name) {
  18. this->name = name;
  19. this->age = age;
  20. }
  21.  
  22. Person() {}
  23.  
  24. };
  25.  
  26. template<class T>
  27. class DynamicArray {
  28. int maxSize = 1;
  29. int extendRatio = 2;
  30. T *array;
  31. public:
  32. int size = 0;
  33.  
  34. DynamicArray() {
  35. array = new T[maxSize];
  36. }
  37.  
  38.  
  39. void add(T data) {
  40. if (maxSize > size) {
  41. array[size] = data;
  42. size++;
  43. } else {
  44. maxSize = extendRatio * size;
  45. T *newArray = new T[maxSize];
  46. for (int i = 0; i < size; i++) {
  47. newArray[i] = array[i];
  48. }
  49. newArray[size] = data;
  50. size++;
  51. delete[] array;
  52. array = newArray;
  53. }
  54. }
  55.  
  56. T get(int index) {
  57. if (index < 0) {
  58. throw 0;
  59. }
  60. if (index >= size) {
  61. throw 1;
  62. }
  63. return array[index];
  64. }
  65.  
  66. bool exist(int index) {
  67. return (index < size && index > 0);
  68. }
  69.  
  70. void set(int index, T data) {
  71. if (index < 0) {
  72. throw 2;
  73. }
  74. if (index >= size) {
  75. throw 3;
  76. }
  77. array[index] = data;
  78. }
  79.  
  80. void clear() {
  81. delete[] array;
  82. size = 0;
  83. }
  84.  
  85. // display only n first elements
  86. string toString(function<string(T)> f) {
  87. ostringstream result;
  88. result << "Size = " << size << endl << "Max size = " << maxSize << endl;
  89. for (int i = 0; i < size; i++) {
  90. result << i << ": " << f(array[i]) << endl;
  91. }
  92. return result.str();
  93. }
  94.  
  95. string toString(function<string(T)> f, int n) {
  96. ostringstream result;
  97. result << "Size = " << size << endl << "Max size = " << maxSize << endl;
  98. for (int i = 0; i < n; i++) {
  99. result << i << ": " << f(array[i]) << endl;
  100. }
  101. return result.str();
  102. }
  103.  
  104. };
  105.  
  106. template<class T>
  107. class Node {
  108. public:
  109. T value;
  110. Node<T> *parent = NULL;
  111. Node<T> *leftKid = NULL;
  112. Node<T> *rightKid = NULL;
  113.  
  114. };
  115.  
  116. template<class T>
  117. class BinaryHeap {
  118. DynamicArray<T> *dynamicArray;
  119. public:
  120.  
  121. BinaryHeap() {
  122. dynamicArray = new DynamicArray<T>();
  123. }
  124.  
  125. ~BinaryHeap() {
  126. delete dynamicArray;
  127. }
  128.  
  129.  
  130. void add(T data, function<bool(T, T)> compare) {
  131. dynamicArray->add(data);
  132. int dataIndex = dynamicArray->size - 1;
  133. int parentIndex = ((dataIndex - 1) / 2);
  134.  
  135. int x = compare(data, dynamicArray->get(parentIndex));
  136.  
  137. while (x == -1) {
  138. swap(dataIndex, parentIndex);
  139.  
  140. dataIndex = parentIndex;
  141. parentIndex = ((dataIndex - 1) / 2);
  142. x = compare(data, dynamicArray->get(parentIndex));
  143. }
  144. }
  145.  
  146. void poll(function<bool(T, T)> compareKids) {
  147. int dataIndex = 0;
  148. int kidLeftIndex = 2 * dataIndex + 1;
  149. int kidRightIndex = 2 * dataIndex + 2;
  150.  
  151. if (dynamicArray->size == 0) {
  152. return;
  153. }
  154. dynamicArray->set(0, dynamicArray->get(dynamicArray->size - 1));
  155.  
  156. bool leftGreater =
  157. dynamicArray->exist(kidLeftIndex) && dynamicArray->get(kidLeftIndex) > dynamicArray->get(dataIndex);
  158. bool rightGreater =
  159. dynamicArray->exist(kidRightIndex) && dynamicArray->get(kidRightIndex) > dynamicArray->get(dataIndex);
  160.  
  161. while (leftGreater || rightGreater) {
  162.  
  163. int x = compareKids(dynamicArray->get(kidLeftIndex), dynamicArray->get(kidRightIndex));
  164. if (x == 1) {
  165. swap(dataIndex, kidLeftIndex);
  166. dataIndex = kidLeftIndex;
  167. } else {
  168. swap(dataIndex, kidRightIndex);
  169. dataIndex = kidRightIndex;
  170. }
  171.  
  172. kidLeftIndex = 2 * dataIndex + 1;
  173. kidRightIndex = 2 * dataIndex + 2;
  174.  
  175. leftGreater =
  176. dynamicArray->exist(kidLeftIndex) && dynamicArray->get(kidLeftIndex) > dynamicArray->get(dataIndex);
  177. rightGreater = dynamicArray->exist(kidRightIndex) &&
  178. dynamicArray->get(kidRightIndex) > dynamicArray->get(dataIndex);
  179. }
  180. dynamicArray->size--;
  181. }
  182.  
  183. string toString(function<string(T)> f) {
  184. return dynamicArray->toString(f);
  185. }
  186.  
  187. private:
  188. void swap(int index1, int index2) {
  189. T tmp = dynamicArray->get(index2);
  190. dynamicArray->set(index2, dynamicArray->get(index1));
  191. dynamicArray->set(index1, tmp);
  192. }
  193.  
  194. void heapUp() {
  195.  
  196. }
  197. };
  198.  
  199.  
  200. int compare(Person newPerson, Person elem) {
  201. if (newPerson.age == elem.age) {
  202. return 0;
  203. } else if (newPerson.age < elem.age) {
  204. return -1;
  205. } else {
  206. return 1;
  207. }
  208. }
  209.  
  210. int compareInt(int newInt, int x) {
  211. if (newInt == x) {
  212. return 0;
  213. } else if (newInt < x) {
  214. return -1;
  215. } else {
  216. return 1;
  217. }
  218. }
  219.  
  220. string intToString(int n) {
  221. ostringstream ss;
  222. ss << n;
  223. return ss.str();
  224. }
  225.  
  226. int main() {
  227. try {
  228. BinaryHeap<int> bh;
  229. bh.add(6, compareInt);
  230. bh.add(5, compareInt);
  231. bh.add(4, compareInt);
  232. bh.add(3, compareInt);
  233. bh.add(2, compareInt);
  234. bh.add(1, compareInt);
  235.  
  236. bh.poll(compareInt);
  237. cout << bh.toString(intToString);
  238.  
  239. cout << "Xd";
  240. } catch (int e) {
  241. cout << e;
  242. }
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement