Guest User

Untitled

a guest
Dec 3rd, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.03 KB | None | 0 0
  1. //ALGO2 IS1 220b LAB04
  2. //Sebastian Ratanczuk
  3. #include <iostream>
  4. #include <string>
  5. #include <time.h>
  6. #include <algorithm>
  7.  
  8. template <typename T>
  9. class Heap;
  10.  
  11. template <typename T>
  12. class Array {
  13. friend class Heap<T>;
  14. private:
  15. void increase()
  16. {
  17. this->MAX_CAP *= this->multip;
  18. T* new_array = new T[MAX_CAP];
  19.  
  20. for (unsigned int i = 0; i < this->counter; i++)
  21. new_array[i] = this->array[i];
  22.  
  23. delete[] this->array;
  24. array = new_array;
  25. }
  26.  
  27. void set(unsigned int number, T data)
  28. {
  29. if (number < this->MAX_CAP)
  30. this->array[number] = data;
  31. }
  32.  
  33. public:
  34. T* array;
  35. unsigned int counter;
  36. unsigned int MAX_CAP;
  37. const int multip = 2;
  38.  
  39. Array()
  40. {
  41. this->MAX_CAP = 1;
  42. this->counter = 0;
  43. this->array = new T[MAX_CAP];
  44. }
  45.  
  46. Array(Array* data)
  47. {
  48. this->MAX_CAP = data->MAX_CAP;
  49. this->counter = data->counter;
  50. this->array = new T[this->MAX_CAP];
  51. for (int i = 0; i < this->counter; i++)
  52. this->array[i] = data->array[i];
  53. }
  54.  
  55. virtual ~Array()
  56. {
  57. //for (unsigned int i = 0; i < this->counter; i++)
  58. //delete array[i];
  59. delete[] array;
  60. }
  61.  
  62. void add_(T data)
  63. {
  64. if (this->counter < this->MAX_CAP)
  65. {
  66. this->array[this->counter] = data;
  67. counter++;
  68. }
  69. else
  70. {
  71. this->increase();
  72. this->array[this->counter] = data;
  73. counter++;
  74. }
  75. }
  76.  
  77. T return_(unsigned int number)
  78. {
  79. if (number < this->counter)
  80. return this->array[number];
  81. else
  82. return NULL;
  83. }
  84.  
  85. std::string to_string(int a)
  86. {
  87. std::string str;
  88. for (unsigned int i = 0; i < a; i++)
  89. str = str + std::to_string(array[i]) + " ";
  90. return str;
  91. }
  92.  
  93. void reset_()
  94. {
  95. this->MAX_CAP = 1;
  96. this->counter = 0;
  97.  
  98. T* new_array = new T[MAX_CAP];
  99.  
  100. delete[] this->array;
  101. this->array = new_array;
  102. }
  103. };
  104.  
  105. template <typename T>
  106. class Heap : private Array<T>
  107. {
  108. public:
  109.  
  110. Heap() {}
  111.  
  112. Heap(Array<T>* a)
  113. {
  114. this->array = a->array;
  115. this->counter = a->counter;
  116. this->MAX_CAP = a->MAX_CAP;
  117. }
  118.  
  119. void reset()
  120. {
  121. this->reset_();
  122. }
  123.  
  124. void heapUp()
  125. {
  126. for (int x = 0; x < this->counter; x++)
  127. {
  128. for (int i = (this->counter - 1); i >= x; i--)
  129. {
  130. int parent = (i - 1) / 2;
  131. int a = this->array[i];
  132. int b = this->array[parent];
  133. if (this->array[i] > this->array[parent])
  134. {
  135. T tmp = this->array[i];
  136. this->array[i] = this->array[parent];
  137. this->array[parent] = tmp;
  138. }
  139. }
  140. }
  141. }
  142.  
  143. void heapDown(int value)
  144. {
  145. unsigned int current = value;
  146. unsigned int left = value * 2 + 1;
  147. unsigned int right = value * 2 + 2;
  148.  
  149. if (left <= this->counter && right >= this->counter)
  150. {
  151. if (this->array[current] < this->array[left])
  152. {
  153. T tmp = this->array[current];
  154. this->array[current] = this->array[left];
  155. this->array[left] = tmp;
  156. current = left;
  157. }
  158. return;
  159. }
  160.  
  161. if (left >= this->counter && right >= this->counter)
  162. return;
  163.  
  164. while ((this->array[current] < this->array[left]) || (this->array[current] < this->array[right]))
  165. {
  166. if ((this->array[left] - this->array[current]) > (this->array[right] - this->array[current]))
  167. {
  168. T tmp = this->array[current];
  169. this->array[current] = this->array[left];
  170. this->array[left] = tmp;
  171. current = left;
  172. }
  173. else
  174. {
  175. T tmp = this->array[current];
  176. this->array[current] = this->array[right];
  177. this->array[right] = tmp;
  178. current = right;
  179. }
  180.  
  181. left = current * 2 + 1;
  182. right = current * 2 + 2;
  183.  
  184. if (left <= this->counter && right >= this->counter)
  185. {
  186. if (this->array[current] < this->array[left])
  187. {
  188. T tmp = this->array[current];
  189. this->array[current] = this->array[left];
  190. this->array[left] = tmp;
  191. current = left;
  192. }
  193. break;
  194. }
  195.  
  196. if (left >= this->counter && right >= this->counter)
  197. break;
  198. }
  199. }
  200.  
  201. void add(T data)
  202. {
  203. if (this->counter == 0)
  204. this->add_(data);
  205. else
  206. {
  207. unsigned int current = this->counter;
  208. this->add_(data);
  209. unsigned int parrent = (current - 1) / 2;
  210. while (this->array[parrent] < this->array[current])
  211. {
  212. T tmp = this->array[current];
  213. this->array[current] = this->array[parrent];
  214. this->array[parrent] = tmp;
  215. current = parrent;
  216. parrent = (current - 1) / 2;
  217. if (current == 0)
  218. break;
  219. }
  220. }
  221. }
  222.  
  223. T pop()
  224. {
  225. if (this->counter == 0)
  226. {
  227. const T to_ret = this->array[0];
  228. this->reset_();
  229. return to_ret;
  230. }
  231. else if (this->counter > 0)
  232. {
  233. const T to_ret = this->array[0];
  234.  
  235. this->array[0] = this->array[--this->counter];
  236. this->array[this->counter] = 0;
  237. unsigned int current = 0;
  238. unsigned int left = 1;
  239. unsigned int right = 2;
  240.  
  241. if (left >= this->counter && right >= this->counter)
  242. return to_ret;
  243.  
  244. if (left <= this->counter && right > this->counter)
  245. {
  246. if (this->array[current] > this->array[left])
  247. {
  248. T tmp = this->array[current];
  249. this->array[current] = this->array[left];
  250. this->array[left] = tmp;
  251. current = left;
  252. }
  253. return to_ret;
  254. }
  255.  
  256. while ((this->array[current] < this->array[left]) || (this->array[current] < this->array[right]))
  257. {
  258. if ((this->array[left] - this->array[current]) > (this->array[right] - this->array[current]))
  259. {
  260. T tmp = this->array[current];
  261. this->array[current] = this->array[left];
  262. this->array[left] = tmp;
  263. current = left;
  264. }
  265. else
  266. {
  267. T tmp = this->array[current];
  268. this->array[current] = this->array[right];
  269. this->array[right] = tmp;
  270. current = right;
  271. }
  272. left = current * 2 + 1;
  273. right = current * 2 + 2;
  274. if (right > this->counter || left > this->counter)
  275. break;
  276. }
  277. return to_ret;
  278. }
  279. else
  280. std::cout << "tablica pusta";
  281. }
  282.  
  283. std::string to_string()
  284. {
  285. std::string str;
  286.  
  287. for (int i = 0; i < 10; i++)
  288. str = str + std::to_string(this->array[i]) + " ";
  289. return str;
  290. }
  291.  
  292. void createHeap()
  293. {
  294. for (int x = this->counter; x >= 0; x--)
  295. {
  296. this->heapDown(x);
  297. }
  298. }
  299.  
  300. void sortHeap()
  301. {
  302. this->createHeap();
  303. //std::cout << this->to_string() << std::endl;
  304. const unsigned int length = this->counter;
  305. for (int i = 0; i < length; i++)
  306. {
  307. unsigned int index = this->counter-1;
  308. T tmp = this->pop();
  309. this->set(index, tmp);
  310. //std::cout << this->to_string() <<", "<<this->counter <<", "<<tmp<<std::endl;
  311. }
  312. this->counter = length;
  313. }
  314. };
  315.  
  316. template <typename T>
  317. void sortCount(Array<T>* a)
  318. {
  319. //std::cout << a->to_string() << std::endl;
  320. int mine = min(a);
  321. //std::cout << mine << std::endl;
  322.  
  323.  
  324. for (int i = 0; i < a->counter; i++)
  325. a->array[i] = a->array[i] - mine;
  326.  
  327. //std::cout << a->to_string() << std::endl;
  328.  
  329. int maxe = max(a);
  330. //std::cout << maxe << std::endl;
  331.  
  332. int size = a->counter-1;
  333. T* tablicaelementow = new T[(maxe+2)];
  334.  
  335. for (int i = 0; i < maxe+1; i++)
  336. ++tablicaelementow[i]=0;
  337.  
  338. for (int i = 0; i <= size; i++)
  339. ++tablicaelementow[a->array[i]];
  340.  
  341. for (int i = maxe; i >= 0; i--)
  342. for (int j = tablicaelementow[i];j>0;j--)
  343. a->array[size--] = i;
  344.  
  345. for (int i = 0; i < a->counter; i++)
  346. a->array[i] = a->array[i] + mine;
  347.  
  348. delete[] tablicaelementow;
  349. }
  350.  
  351. template <typename T>
  352. void sortBucket(Array<T>* a, const int n)
  353. {
  354. using namespace std;
  355. T mine = min(a);
  356. T maxe = max(a);
  357. int ilosc = maxe - mine;
  358.  
  359. Array<T>** buckets = new Array<T>*[(ilosc+1)];
  360. for (int i = 0; i < ilosc + 1; i++)
  361. {
  362. buckets[i] = new Array<T>;
  363. }
  364.  
  365. for (int i = 0; i < a->counter; i++)
  366. {
  367. //cout << a->array[i] - mine << endl;
  368. buckets[a->array[i] - mine]->add_(a->array[i]);
  369. }
  370.  
  371. for (int i = 0; i < ilosc+1; i++)
  372. {
  373. sortHeap(buckets[i]);
  374. }
  375.  
  376. int id = 0;
  377. for (int i = 0; i < ilosc + 1; i++)
  378. {
  379. for (int j = 0; j < buckets[i]->counter; j++)
  380. a->array[id++] = buckets[i]->array[j];
  381. }
  382.  
  383. for (int i = 0; i < ilosc + 1; i++)
  384. {
  385. delete buckets[i];
  386. }
  387. delete[] buckets;
  388. }
  389.  
  390. template<typename T>
  391. bool isSorted(Array<T>* a){
  392.  
  393. for (int i = 0; i < a->counter-1; i++)
  394. {
  395. if (a->array[i] > a->array[i + 1])
  396. return false;
  397. }
  398. return true;
  399. }
  400.  
  401. template<typename T>
  402. T min(Array<T>* a)
  403. {
  404. T min = a->array[0];
  405.  
  406. for (int i = 0; i < a->counter; i++)
  407. if (min > a->array[i])
  408. min = a->array[i];
  409. return min;
  410. }
  411.  
  412. template<typename T>
  413. T max(Array<T>* a)
  414. {
  415. T max = a->array[0];
  416.  
  417. for (int i = 0; i < a->counter; i++)
  418. if (max < a->array[i])
  419. max = a->array[i];
  420.  
  421. return max;
  422. }
  423.  
  424. template <typename T>
  425. void sortHeap(Array<T>* a)
  426. {
  427. Heap<T>* heap = new Heap<T>(a);
  428. heap->sortHeap();
  429. }
  430.  
  431. int porownaj_int(const void* a, const void* b) { // funkcja porównująca
  432. int* arg1 = (int*)a;
  433. int* arg2 = (int*)b;
  434. if (*arg1 < *arg2) return -1;
  435. else if (*arg1 == *arg2) return 0;
  436. else return 1;
  437. }
  438.  
  439. template<typename T>
  440. void sortQuick(Array<T>*a)
  441. {
  442. std::qsort(a->array, a->counter, sizeof(int), porownaj_int);
  443. }
  444.  
  445. int main()
  446. {
  447. //srand(time(NULL));
  448. srand(0);
  449. const int MAX_ORDER = 8;
  450. for (int o = 1; o < MAX_ORDER; o++)
  451. {
  452. std::cout << "Przebieg " << o << std::endl;
  453. Array<int>* tablica1 = new Array<int>;
  454. const int MAXIMUM = pow(10,5);
  455. const int n = pow(10, o);
  456.  
  457. for (int i = 0; i < n; i++)
  458. tablica1->add_(((rand() << 15) + rand()) % MAXIMUM);
  459.  
  460. Array<int>* tablica2 = new Array<int>(tablica1);
  461. Array<int>* tablica3 = new Array<int>(tablica1);
  462. Array<int>* tablica4 = new Array<int>(tablica1);
  463.  
  464. //heap sort
  465. Heap<int>* kopiec = new Heap<int>(tablica1);
  466.  
  467. clock_t t1 = clock();
  468. kopiec->sortHeap();
  469. clock_t t2 = clock();
  470.  
  471. double time1 = (t2 - t1) / (double)CLOCKS_PER_SEC;
  472. std::cout << "Heap sort: " << "Czas ogolny: " << time1 * 1000 << " milisekund. " << "Czas na element: " << (time1 / n) * 1000000 << " mikrosekund. " << "Is sorted? " << isSorted(tablica1) << std::endl;
  473. //std::cout << tablica1->to_string() << std::endl;
  474.  
  475. //count sort
  476. t1 = clock();
  477. sortCount(tablica2);
  478. t2 = clock();
  479. time1 = (t2 - t1) / (double)CLOCKS_PER_SEC;
  480. std::cout << "Count sort: " << "Czas ogolny: " << time1 * 1000 << " milisekund. " << "Czas na element: " << (time1 / n) * 1000000 << " mikrosekund. " << "Is sorted? " << isSorted(tablica2) << std::endl;
  481. //std::cout << tablica2->to_string() << std::endl;
  482.  
  483. //bucket sort
  484. t1 = clock();
  485. sortBucket(tablica3, 1);
  486. t2 = clock();
  487. time1 = (t2 - t1) / (double)CLOCKS_PER_SEC;
  488. std::cout << "Bucket sort: " << "Czas ogolny: " << time1 * 1000 << " milisekund. " << "Czas na element: " << (time1 / n) * 1000000 << " mikrosekund. " << "Is sorted? " << isSorted(tablica3) << std::endl;
  489. //std::cout << tablica3->to_string() << std::endl;
  490.  
  491. //quick sort
  492. t1 = clock();
  493. sortQuick(tablica4);
  494. t2 = clock();
  495. time1 = (t2 - t1) / (double)CLOCKS_PER_SEC;
  496. std::cout << "Quick sort: " << "Czas ogolny: " << time1 * 1000 << " milisekund. " << "Czas na element: " << (time1 / n) * 1000000 << " mikrosekund. " << "Is sorted? " << isSorted(tablica4) << std::endl << std::endl;
  497. //std::cout << tablica3->to_string() << std::endl;
  498.  
  499. delete tablica1;
  500. delete tablica2;
  501. delete tablica3;
  502. delete tablica4;
  503. }
  504.  
  505. return 0;
  506. }
  507.  
  508. class Osoba
  509. {
  510. public:
  511. int losowepole1;
  512. int losowepole2;
  513.  
  514. Osoba()
  515. {
  516. losowepole1 = rand();
  517. losowepole2 = rand();
  518. }
  519.  
  520. void operator = (int z)
  521. {
  522. this->losowepole1 = z;
  523. }
  524.  
  525. bool operator < (Osoba x)
  526. {
  527. if (this->losowepole1 < x.losowepole1)
  528. {
  529. return true;
  530. }
  531. return false;
  532. }
  533.  
  534. bool operator > (Osoba x)
  535. {
  536. if (this->losowepole1 > x.losowepole1)
  537. {
  538. return true;
  539. }
  540. return false;
  541. }
  542.  
  543. int operator - (Osoba x)
  544. {
  545. return (this->losowepole1 - x.losowepole1);
  546. }
  547. };
  548.  
  549. //int main()//obiekty
  550. //{
  551. // srand(time(NULL));
  552. // srand(0);
  553. // const int MAX_ORDER = 8;
  554. // for (int o = 1; o < MAX_ORDER; o++)
  555. // {
  556. // std::cout << "Przebieg " << o << std::endl;
  557. // Array<Osoba>* tablica1 = new Array<Osoba>;
  558. // const int MAXIMUM = pow(10,5);
  559. // const int n = pow(10, o);
  560. //
  561. // for (int i = 0; i < n; i++)
  562. // {
  563. // Osoba os;
  564. // tablica1->add_(os);
  565. // }
  566. //
  567. // Array<Osoba>* tablica2 = new Array<Osoba>(tablica1);
  568. //
  569. //
  570. // //heap sort
  571. // Heap<Osoba>* kopiec = new Heap<Osoba>(tablica1);
  572. //
  573. // clock_t t1 = clock();
  574. // kopiec->sortHeap();
  575. // clock_t t2 = clock();
  576. //
  577. // double time1 = (t2 - t1) / (double)CLOCKS_PER_SEC;
  578. // std::cout << "Heap sort: " << "Czas ogolny: " << time1 * 1000 << " milisekund. " << "Czas na element: " << (time1 / n) * 1000000 << " mikrosekund. " << "Is sorted? " << isSorted(tablica1) << std::endl;
  579. // //std::cout << tablica1->to_string() << std::endl;
  580. //
  581. //
  582. //
  583. // //bucket sort
  584. // t1 = clock();
  585. // sortBucket(tablica2, 1);
  586. // t2 = clock();
  587. // time1 = (t2 - t1) / (double)CLOCKS_PER_SEC;
  588. // std::cout << "Bucket sort: " << "Czas ogolny: " << time1 * 1000 << " milisekund. " << "Czas na element: " << (time1 / n) * 1000000 << " mikrosekund. " << "Is sorted? " << isSorted(tablica2) << std::endl;
  589. // //std::cout << tablica3->to_string() << std::endl;
  590. //
  591. // delete tablica1;
  592. // delete tablica2;
  593. // }
  594. //
  595. // return 0;
  596. //}
Advertisement
Add Comment
Please, Sign In to add comment