Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.07 KB | None | 0 0
  1. #include <iostream>
  2. #include <time.h>
  3. #include <exception>
  4. #include <random>
  5. #include <string>
  6. template <typename T>
  7. struct node {
  8. node() {};
  9. node(T value) : data(value) {}
  10. T data;
  11. };
  12.  
  13. template <typename T>
  14. struct kopiec {
  15. long int size = 0;
  16. long int capacity = 1;
  17. node<T>* table = new node<T>[capacity];
  18. kopiec() {
  19.  
  20. }
  21. kopiec(T* tablica, int rozmiar) {
  22. size = rozmiar;
  23. for (int i = 0; i <= size; i++) {
  24. table[i] = *(tablica + i);
  25. }
  26. przekopcowanieRekWDol(0);
  27. }
  28. ~kopiec() {
  29. delete[] table;
  30. }
  31. int leftChild(int indeks) {
  32. int left = 2 * indeks;
  33. if (left <= size && left >= 0) {
  34. return left;
  35. }
  36. else {
  37. return -1;
  38. }
  39. }
  40. int rightChild(int indeks) {
  41. int right = 2 * indeks + 1;
  42. if (right <= size && right >= 0) {
  43. return right;
  44. }
  45. else {
  46. return -1;
  47. }
  48. }
  49. int parent(int indeks) {
  50. if (indeks > 0) {
  51. int rodzic = (indeks - 1) / 2;
  52. if (rodzic <= size && rodzic >= 0) {
  53. return rodzic;
  54. }
  55. else {
  56. return -1;
  57. }
  58. }
  59. else {
  60. return -1;
  61. }
  62. }
  63. T getAndDeleteMax() {
  64. T chwilowy = table[0].data;
  65.  
  66. size--;
  67. table[0] = table[size];
  68.  
  69. //przesunięcie tablicy o 1 w lewo
  70. /*for (int i = 0; i < size; i++) {
  71. table[i].data = table[i + 1].data;
  72. }
  73.  
  74. if (table[0].data < table[1].data) {
  75. T chwilowyII = table[0].data;
  76. table[0].data = table[1].data;
  77. table[1] = chwilowyII;
  78. }
  79. if (table[0].data < table[2].data) {
  80. T chwilowyII = table[0].data;
  81. table[0].data = table[2].data;
  82. table[2] = chwilowyII;
  83. }*/
  84. przekopcowanieRekWDol(0);
  85.  
  86. return chwilowy;
  87. }
  88. void addNewNode(node<T> newData) {
  89. if (size < capacity) {
  90. table[size] = node<T>{ newData };
  91. size++;
  92. }
  93. else {
  94. capacity = capacity * 2;
  95. node<T>* biggerTable = new node<T>[capacity];
  96. for (int i = 0; i < size; i++) {
  97. biggerTable[i] = table[i];
  98. }
  99. delete[] table;
  100. table = biggerTable;
  101. table[size] = node<T>{ newData };
  102. size++;
  103. }
  104. if (size > 1) {
  105. przekopcowanieRekWGore(size - 1);
  106. }
  107. }
  108. void deleteAll() {
  109. delete[] table;
  110. }
  111. void showAll() {
  112. for (int i = 0; i < size; i++) {
  113. std::cout << table[i];
  114. }
  115. }
  116. void przekopcowanieRekWGore(int indeks) {
  117. auto rodzic = parent(indeks);
  118. if (rodzic >= 0) {
  119. T chwilowy = table[rodzic].data;
  120. if (indeks > 0 && chwilowy < table[indeks].data)
  121. {
  122. table[rodzic].data = table[indeks].data;
  123. table[indeks].data = chwilowy;
  124. przekopcowanieRekWGore(rodzic);
  125. }
  126. }
  127. else {
  128. //std::cout << "przekopcowaniewgore nie tak" << std::endl;
  129. }
  130. }
  131. void przekopcowanieRekWDol(int indeks) {
  132. int largest = indeks;
  133. int left = leftChild(indeks);
  134. int right = rightChild(indeks);
  135.  
  136. if (left > 0 && table[left].data > table[largest].data) {
  137. largest = left;
  138. }
  139. if (right > 0 && table[right].data > table[largest].data) {
  140. largest = right;
  141. }
  142. if (largest != indeks) {
  143. node<T> chwilowy;
  144. chwilowy.data = table[indeks].data;
  145. table[indeks].data = table[largest].data;
  146. table[largest] = chwilowy;
  147. //std::cout << indeks << std::endl;
  148. przekopcowanieRekWDol(largest);
  149. }
  150. }
  151. void sort() {
  152. for (int i = 0; i <= size; i++) {
  153. T chwilowy = table[0].data;
  154. table[0] = table[size];
  155. przekopcowanieRekWDol(0);
  156. table[size] = chwilowy;
  157. }
  158. }
  159. };
  160.  
  161. template <typename T>
  162. std::ostream& operator<<(std::ostream& out, const node<T>& val) {
  163. out << val.data << std::endl;
  164. return out;
  165. }
  166.  
  167. int main() {
  168. std::random_device rd;
  169. std::mt19937 gen(rd());
  170. std::uniform_int_distribution<int> losowa(1, 10000);
  171. const int MAX_ORDER = 1; // maksymalny rzad wielkosci dodawanych danych
  172.  
  173. double time1 = 0;
  174.  
  175. for (int o = 1; o <= MAX_ORDER; o++)
  176. {
  177. int n = 0;
  178. kopiec <int> example; // stworzenie kopca
  179. clock_t t1 = clock();
  180. //dodawanie do kopca
  181. for (int i = pow(10, o); i > 0; i--)
  182. {
  183. int liczba = losowa(gen);
  184. example.addNewNode(i);
  185.  
  186. n++;
  187. }
  188. clock_t t2 = clock();
  189.  
  190. std::cout << "Czas dodawania " << n << " elemenow: " << time1 << std::endl;
  191.  
  192. }
  193. std::cout << "koniec" << std::endl;
  194. getchar();
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement