Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.27 KB | None | 0 0
  1.  
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<time.h>
  5.  
  6. using namespace std;
  7.  
  8. template <typename T>
  9. class Sort {
  10. private:
  11. T *pom; // tablica pomocnicza potrzebna do scalania
  12. T *tab;
  13. int size;
  14.  
  15. public:
  16. Sort(int _size)
  17. {
  18. size = _size;
  19. tab = new T[size];
  20. pom = new T[size];
  21. }
  22. ~Sort() {
  23. delete [] tab;
  24. delete[] pom;
  25. }
  26. void wyswietlanie()
  27. {
  28. for (int i = 0; i < size; i++)
  29. cout << tab[i] << " ";
  30. cout << "wyswietlono pomyslnie " << size << " elementow" << endl;
  31. }
  32.  
  33. void merge_f(int lewyindex, int srodek, int prawyindex) //scalanie posortowanych tablic
  34. {
  35. int poczatek1 = lewyindex; //poczatek 1 polowy tablicy
  36. int poczatek2 = srodek + 1; // poczatek 2 polowy tablicy
  37. int pomocnik = lewyindex; // kontrolny na jakie miejsce wpisujemy najmmniejszy element do tablicy
  38. //kopiujemy lewą i prawą część tablicy do tablicy pomocniczej DO YWJEBANIA CHYBA!!!!!!!!!!!!!!!!!!!!!!!!!
  39. for (int i = lewyindex; i <= prawyindex; i++)
  40. pom[i] = tab[i];
  41.  
  42. while (poczatek1 <= srodek && poczatek2 <= prawyindex)
  43. {
  44. if (pom[poczatek1] <= pom[poczatek2])
  45. {
  46. tab[pomocnik] = pom[poczatek1];
  47. poczatek1++;
  48. }
  49. else
  50. {
  51. tab[pomocnik] = pom[poczatek2];
  52. poczatek2++;
  53. }
  54. pomocnik++;
  55. }
  56. while (poczatek1 <= srodek)
  57. {
  58. tab[pomocnik] = pom[poczatek1];
  59. pomocnik++;
  60. poczatek1++;
  61.  
  62. }
  63. }
  64.  
  65. void mergeSort(int lewyindex, int prawyindex)
  66. {
  67. //gdy mamy jeden element, to jest on już posortowany
  68. if (lewyindex < prawyindex)
  69. {
  70.  
  71. //znajdujemy srodek podtablicy
  72. int srodek = (prawyindex + lewyindex) / 2;
  73.  
  74. //dzielimy tablice na częsć lewą i prawa
  75. mergeSort( lewyindex, srodek);
  76. mergeSort(srodek + 1, prawyindex);
  77.  
  78. merge_f(lewyindex, srodek, prawyindex);
  79. }
  80. }
  81.  
  82. /* Sortowanie szybkie */
  83. void sort_szybkie(int lewyindex, int prawyindex) // ew na poczatku w nawiasie int tab[]????????????????????????
  84. {
  85. int i, j, pivot;
  86. i = (lewyindex + prawyindex) / 2;
  87. pivot = tab[i];
  88. tab[i] = tab[prawyindex];
  89.  
  90. i = lewyindex;
  91. j = lewyindex;
  92. while (i < prawyindex) {
  93. if (tab[i] < pivot) {
  94. int tmp = tab[i];
  95. tab[i] = tab[j];
  96. tab[j] = tmp;
  97. j++;
  98. }
  99. i++;
  100. }
  101. tab[prawyindex] = tab[j];
  102. tab[j] = pivot;
  103. if (lewyindex < j - 1) {
  104. sort_szybkie(lewyindex, j - 1);
  105. }
  106. if (j + 1 < prawyindex) {
  107. sort_szybkie(j + 1, prawyindex);
  108. }
  109. }
  110. /* Sortowanie introspektywne*/
  111.  
  112. void intro(int lewyindex, int prawyindex, int max_wyw) {
  113. int i, j;
  114. int pivot;
  115. //max wyw moment aby zatrzymac quicksorta&& po zatrzymaniu robi wstawianie albo inne sortowanie - intro sort to ulepszenie quicksorta o taka mozliwosc
  116.  
  117. if (max_wyw == 0) {
  118. insert_sort();
  119. }
  120.  
  121. if (max_wyw > 0) {
  122. max_wyw = max_wyw - 1;
  123.  
  124. i = (lewyindex + prawyindex) / 2;
  125. pivot = tab[i];
  126. tab[i] = tab[prawyindex];
  127.  
  128. i = lewyindex;
  129. j = lewyindex;
  130. while (i < prawyindex) {
  131. if (tab[i] < pivot) {
  132. int tmp = tab[i];
  133. tab[i] = tab[j];
  134. tab[j] = tmp;
  135. j++;
  136. }
  137. i++;
  138. }
  139. tab[prawyindex] = tab[j];
  140. tab[j] = pivot;
  141. if (lewyindex < j - 1) {
  142. intro(lewyindex, j - 1, max_wyw);
  143. }
  144. if (j + 1 < prawyindex) {
  145. intro(j + 1, prawyindex, max_wyw);
  146. }
  147. }
  148.  
  149. }
  150. void sort_intro(int lewyindex, int prawyindex) {
  151. int max_wyw = int(2 * log(prawyindex - lewyindex + 1));
  152. }
  153.  
  154.  
  155. void insert_sort() //DZIAAAAALA
  156. {
  157. for (int j = 0; j <size; j++)
  158. for (int i = 0; i <size; i++)
  159. {
  160. if (tab[i - 1] > tab[i])
  161. {// patrze czy moj prio jest wiekszy od wczesniejeszego
  162. //jesli tak to przesuwamy wszytsko w prawo i wstawiamy nasz elem i klucz
  163.  
  164.  
  165. T temp_v = tab[i - 1]; //przechowuja nastepny klucz
  166.  
  167.  
  168. tab[i - 1] = tab[i];
  169. tab[i] = temp_v;
  170. //moving values and keys 1 position to the right
  171. //break;
  172. }
  173. }
  174. }
  175. void uzupelnianie(T dlugosc) {
  176. srand(time(NULL));
  177. for (int i = 0; i < dlugosc; i++)
  178. tab[i] = rand();
  179. }
  180.  
  181. void odwracanie_tab()
  182. {
  183.  
  184. double temp;
  185. for (int i = 0; i < size / 2; i++)
  186. {
  187. temp = tab[size - i - 1];
  188. tab[size- i - 1] = tab[i];
  189. tab[i] = temp;
  190. }
  191. }
  192.  
  193. };
  194.  
  195.  
  196.  
  197. int main()
  198. {
  199. double time;
  200. long int n=0; //liczba elem
  201.  
  202. cout << "Wpisz ilosc elementow w tablicy...\n mozliwe opcje to: \n 10 000 elementow \n 50 000 elementow \n 100 000 elementow\n 500 000 elementow\n 1 000 000 elementow\n";
  203. cin >> n;
  204. Sort <double> m(n);
  205. m.uzupelnianie(n);
  206. cout << endl << endl;
  207. //m.wyswietlanie();
  208. //cout << endl;
  209. //m.wyswietlanie();
  210.  
  211. double time_begin = clock();
  212. for (int i = 0; i < 100; i++)
  213. {
  214. m.sort_szybkie(0,n-1); //tu zmienia sie sposob sortowania
  215. }
  216. double time_end = clock();
  217. time = (time_end - time_begin) / 100;
  218. cout << endl << "Czas sort'a: " << time<< endl;
  219. //m.wyswietlanie();
  220. cout << endl;
  221.  
  222. system("pause");
  223. return 0;
  224. }
  225. /*
  226. //ponizej sortowanie gdy 50% jest juz posortowane
  227.  
  228. m.sort_intro(0, n/2 - 1); //tu zmienia sie sposob sortowania
  229. double time_begin = clock();
  230.  
  231. for (int i = 0; i < 100; i++) //50% posortowane na poczatku reszta rand()
  232. {
  233. m.sort_intro(0, n - 1); //tu zmienia sie sposob sortowania
  234. }
  235. double time_end = clock();
  236. time = (time_end - time_begin) / 100;
  237.  
  238. //posortowane ale odwrotnie
  239.  
  240. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement