Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.95 KB | None | 0 0
  1. #include <iostream>
  2. #include<cstdlib>
  3. #include<algorithm>
  4. #include<ctime>
  5. #include<cstdlib>
  6. #include<time.h>
  7. #include<fstream>
  8. #include<chrono>
  9. #define LEWY(w) ((2)*(w))
  10. #define PRAWY(w) ((w)*2 +1)
  11.  
  12. using namespace std;
  13.  
  14.  
  15. int licznik_operacji = 0;
  16.  
  17.  
  18. void losowe_liczby_increase(int n, int *tab, int k);
  19.  
  20. bool malejaco(int a, int b);
  21.  
  22. void losowe_liczby_decrease(int n, int *tab, int k);
  23.  
  24. void losowe_liczby_V(int n, int *tab, int k);
  25.  
  26. void losowe_liczby_A(int n, int *tab, int k);
  27.  
  28. void losowe_liczby_los(int n, int *tab, int k);
  29.  
  30.  
  31.  
  32. void shell_sort_shell(int *a, int rozmiar)
  33. {
  34.     porownania = 0;
  35.     zamiana = 0;
  36.     int przeskok = rozmiar / 2;
  37.     while (przeskok >= 1)
  38.     {
  39.         insertion_sort_shell(a, rozmiar, przeskok);
  40.         przeskok /= 2;
  41.     }
  42. }
  43. void shell_sort_knuth(int *a, int rozmiar)
  44. {
  45.     porownania = 0;
  46.     zamiana = 0;
  47.     int przeskok;
  48.     for (przeskok = 1; przeskok < rozmiar; przeskok = przeskok * 3 + 1);
  49.     przeskok /= 9;
  50.     if (!przeskok)
  51.         przeskok++;
  52.     while (przeskok > 0)
  53.     {
  54.         insertion_sort_shell(a, rozmiar, przeskok);
  55.         przeskok /= 3;
  56.     }
  57. }
  58. void insertion_sort_shell(int *a, int rozmiar, int przeskok)
  59. {
  60.     int buff, j;
  61.     for (int i = przeskok; i < rozmiar; i++)
  62.     {
  63.         buff = a[i];
  64.         licznik_operacji++;
  65.         for (j = i; j >= przeskok && a[j - przeskok] > buff; j -= przeskok, licznik_operacji++;)
  66.         {
  67.             a[j] = a[j - przeskok];
  68.             licznik_operacji++;
  69.  
  70.         }
  71.  
  72.         a[j] = buff;
  73.         zamiana++;
  74.     }
  75. }
  76.  
  77.  
  78.  
  79.  
  80. void scal(int dol, int srodek, int gora, int *tab, int * pom) {//w merge sorcie wpisujemy dane do pomocniczej tablicy wiec nie ma defacto zamiany el stad nalezy liczyc il operacji przypisania do tablicy wynikowej
  81.     int i = dol, j = srodek + 1;
  82.     for (int k = dol; k <= gora; k++) //n operacji przypisania
  83.     {
  84.         pom[k] = tab[k];
  85.         licznik_operacji++;
  86.     }
  87.  
  88.     for (int k = dol; k <= gora; k++) {// co najmniej n operacji porownan(c*n) + n operacji przypisan//gdzie c jest stala
  89.         licznik_operacji++;
  90.         if (i <= srodek) {
  91.             licznik_operacji++;
  92.             if (j <= gora) {
  93.                 licznik_operacji++;
  94.                 if (pom[j] > pom[i]) {
  95.                     tab[k] = pom[j++];
  96.                     licznik_operacji ++;
  97.                 }
  98.                 else
  99.                     tab[k] = pom[i++];
  100.                 licznik_operacji++;
  101.             }
  102.             else
  103.                 tab[k] = pom[i++];
  104.             licznik_operacji++;
  105.         }
  106.         else
  107.             tab[k] = pom[j++];
  108.         licznik_operacji++;
  109.     }
  110. }
  111.  
  112. void Merge_sort(int dol, int gora, int *tab, int * pom) {
  113.     licznik_operacji++;
  114.     if (gora <= dol)  return;
  115.     Merge_sort(dol, (dol + gora) / 2, tab, pom);
  116.     Merge_sort((dol + gora) / 2 + 1, gora, tab, pom);
  117.  
  118.     scal(dol, (gora + dol) / 2, gora, tab, pom);
  119. }
  120.  
  121.  
  122.  
  123.  
  124. void restore_heap(int n, int *tab, int  wezel) {//n to jest heap size
  125.     int smallest;
  126.     int  l = LEWY(wezel);
  127.     int p = PRAWY(wezel);
  128.     licznik_operacji += 2;
  129.     if (l<n && tab[l] <tab[wezel]) //lewy
  130.     {
  131.         smallest = l;
  132.     }
  133.     else
  134.     {
  135.         smallest = wezel;
  136.     }
  137.     licznik_operacji ++;
  138.     if (p<n && tab[p] <tab[smallest])
  139.     {
  140.         smallest = p;
  141.         licznik_operacji++;
  142.  
  143.     }
  144.     swap(tab[wezel], tab[smallest]);
  145.     licznik_operacji += 2;
  146.     if (smallest != wezel)
  147.         restore_heap(n, tab, smallest);
  148.  
  149. }
  150. void zbuduj_heap(int n, int *tab) {
  151.  
  152.     for (int i = n / 2; i > 0; i--)
  153.     {
  154.         restore_heap(n, tab, i);
  155.     }
  156.  
  157. }
  158.  
  159. void heap_sort(int *tab, int n) {//na potrzeby heap sort nalezy indeksowac od i =1 do n
  160.  
  161.     zbuduj_heap(n, tab);
  162.     n -= 1;
  163.     for (int i = n; i > 1; i--) {
  164.         swap(tab[1], tab[i]);
  165.         n -= 1;
  166.         restore_heap(n, tab, 1);
  167.     }
  168.  
  169. }
  170.  
  171.  
  172.  
  173. void quick_sort(int tab[], int dol, int gora) {//pivotem pierwszy el tablicy
  174.     licznik_operacji++;
  175.     if (gora <= dol) { return; }
  176.     int pivot = tab[dol];
  177.     //cout << pivot << endl;///////////////////////wypisz wartosc pivota w kazdym wywolaniu
  178.     int j = gora + 1, i = dol - 1;
  179.  
  180.     while (1) {
  181.  
  182.         while (pivot < tab[++i]) { licznik_operacji++; };
  183.  
  184.  
  185.         while (pivot > tab[--j]) { licznik_operacji++; };
  186.        
  187.         if (j >= i) {
  188.             swap(tab[i], tab[j]); licznik_operacji ++;
  189.  
  190.         }
  191.         else { break; }
  192.     }
  193.    
  194.     if (j > dol) { quick_sort(tab, dol, j); }
  195.     if (i < gora) { quick_sort(tab, i, gora); }
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement