Advertisement
Guest User

Untitled

a guest
Apr 26th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <time.h>
  4.  
  5. using namespace std;
  6. clock_t start, stop;
  7. double czas;
  8.  
  9. void quicksort(int *tab, int lewy, int prawy, int &zamiana, int &porownanie)
  10. {
  11.     int i = lewy, j = prawy, p;
  12.     p = tab[(lewy + prawy) / 2];
  13.  
  14.     do
  15.     {
  16. porownanie++;
  17.         while (tab[i] < p)
  18.         {
  19.             i++;
  20. porownanie++;
  21.         }
  22. porownanie++;
  23.         while (tab[j] > p)
  24.         {
  25. porownanie++
  26.             j--;
  27.         }
  28.         porownanie++;
  29.         if (i <= j)
  30.         {
  31.             swap(tab[i++], tab[j--]);
  32.             zamiana++;
  33.         }
  34.     } while (i <= j);
  35.     porownanie++;
  36.     if (i < prawy)quicksort(tab, i, prawy, zamiana, porownanie);
  37.     porownanie++;
  38.     if (j > lewy)quicksort(tab, lewy, j, zamiana, porownanie);
  39. }
  40.  
  41. void merge(int *tab, int lewy, int srodek, int prawy, int *pom, int &zamiana, int &porownanie)
  42. {
  43.     int i = lewy, j = srodek + 1;
  44.     for (int i = lewy; i <= prawy; i++)
  45.     {
  46.         pom[i] = tab[i];
  47.     }
  48.     for (int k = lewy; k <= prawy; k++)
  49.     {
  50.         porownanie++;
  51.         if (i <= srodek)
  52.         {
  53.             porownanie++;
  54.             if (j <= prawy)
  55.             {
  56.                 porownanie++;
  57.                 if (pom[i] > pom[j])
  58.                 {
  59.                     tab[k] = pom[j++];
  60.                 }
  61.                 else
  62.                     tab[k] = pom[i++];
  63.             }
  64.             else
  65.                 tab[k] = pom[i++];
  66.         }
  67.         else
  68.             tab[k] = pom[j++];
  69.     }
  70.  
  71. }
  72.  
  73. void mergesort(int *tab, int lewy, int prawy, int* pom, int &zamiana, int &porownanie)
  74. {
  75.     porownanie++;
  76.     if (prawy <= lewy)return;
  77.  
  78.     int srodek = (lewy + prawy) / 2;
  79.  
  80.     mergesort(tab, lewy, srodek, pom, zamiana, porownanie);
  81.     mergesort(tab, srodek + 1, prawy, pom, zamiana, porownanie);
  82.  
  83.     merge(tab, lewy, srodek, prawy, pom, zamiana, porownanie);
  84. }
  85.  
  86. void wstawianie(int *tab, int n, int &zamiana, int &porownanie)
  87. {
  88.     int i, j, x;
  89.     for (i = 1; i < n; i++)
  90.     {
  91.         x = tab[i];
  92.         j = i - 1;
  93.         porownanie++;
  94.         while ((j >= 0) && (x < tab[j]))
  95.         {
  96.             porownanie++;
  97.             tab[j + 1] = tab[j];
  98.             j--;
  99.             zamiana++;
  100.         }
  101.         tab[j + 1] = x;
  102.         zamiana++;
  103.     }
  104. }
  105.  
  106. void wybieranie(int *tab, int n, int &zamiana, int &porownanie)
  107. {
  108.     int i, j, pmin, x;
  109.     for (i = 0; i < n - 1; i++)
  110.     {
  111.         pmin = i;
  112.         for (j = i + 1; j < n; j++)
  113.         {
  114.             porownanie++;
  115.             if (tab[j] < tab[pmin])
  116.                 pmin = j;
  117.         }
  118.         zamiana++;
  119.         x = tab[i];
  120.         tab[i] = tab[pmin];
  121.         tab[pmin] = x;
  122.     }
  123. }
  124.  
  125. void kopiec(int *tab, int n, int &zamiana, int &porownanie)
  126. {
  127.     int i, j, k, x, m;
  128.     porownanie++;
  129.     for (i = 2; i <= n; i++)
  130.     {
  131.         j = i; k = j / 2;
  132.         x = tab[i];
  133.         porownanie++;
  134.         while ((k > 0) && (tab[k] < x))
  135.         {
  136.         porownanie++;
  137.             tab[j] = tab[k];
  138.             j = k; k = j / 2;
  139.         }
  140.         tab[j] = x;
  141.         zamiana++;
  142.     }
  143.  
  144.     //rozbieramy kopiec
  145.  
  146.     for (i = n; i > 1; i--)
  147.     {
  148.         x = tab[1];
  149.         tab[1] = tab[i];
  150.         tab[i] = x;
  151.         zamiana++;
  152.         j = 1; k = 2;
  153.         while (k < i)
  154.         {
  155.             porownanie++;
  156.             if ((k + 1 < i) && (tab[k + 1] > tab[k]))
  157.                 m = k + 1;
  158.             else
  159.                 m = k;
  160.             porownanie++;
  161.             if (tab[m] <= tab[j])
  162.                 break;
  163.             x = tab[j];
  164.             tab[j] = tab[m];
  165.             tab[m] = x;
  166.             zamiana++;
  167.             j = m;
  168.             k = j + j;
  169.         }
  170.     }
  171. }
  172.  
  173. void bsortopt(int *tab, int n, int &zamiana, int &porownanie)
  174. {
  175.     int pmin = 0, pmax = n - 1, p;
  176.     do
  177.     {
  178.         p = -1;
  179.         for (int i = pmin; i < pmax; i++)
  180.         {
  181.             porownanie++;
  182.             if (tab[i] > tab[i + 1])
  183.             {
  184.                 zamiana++;
  185.                 swap(tab[i], tab[i + 1]);
  186.                 porownanie++;
  187.                 if (p < 0) pmin = i;
  188.                 p = i;
  189.             }
  190.         }
  191.         if (pmin) pmin--;
  192.         pmax = p;
  193.     } while (p >= 0);
  194. }
  195.  
  196. void main()
  197. {
  198.     int zamiana = 0, porownanie = 0;
  199.     srand(time(NULL));
  200.     int ile;
  201.     cout << "Podaj liczbe elementow: ";
  202.     cin >> ile;
  203.     int *tab = new int[ile];
  204.     int *tab1 = new int[ile];
  205.     int *tab2 = new int[ile];
  206.     int *kop = new int[ile + 1];
  207.     int *tab3 = new int[ile];
  208.     int *tab4 = new int[ile];
  209.     int *pom = new int[ile];
  210.  
  211.     //tablice random
  212.  
  213.     /*for (int i = 1; i <= ile; i++)
  214.     {
  215.     kop[i] = rand() % 100+1;
  216.     tab[i - 1] = kop[i];
  217.     tab1[i - 1] = kop[i];
  218.     tab2[i - 1] = kop[i];
  219.     tab3[i - 1] = kop[i];
  220.     tab4[i - 1] = kop[i];
  221.     }*/
  222.  
  223.     //tablice posortowane
  224.  
  225.     /*for (int i = 1; i <= ile; i++)
  226.     {
  227.     kop[i] = i;
  228.     tab[i - 1] = kop[i];
  229.     tab1[i - 1] = kop[i];
  230.     tab2[i - 1] = kop[i];
  231.     tab3[i - 1] = kop[i];
  232.     tab4[i - 1] = kop[i];
  233.     }*/
  234.  
  235.     //tablice czesciowo posortowane
  236.  
  237.     for (int i = 1; i < ile / 2; i++)
  238.     {
  239.         kop[i] = i;
  240.         tab[i - 1] = kop[i];
  241.         tab1[i - 1] = kop[i];
  242.         tab2[i - 1] = kop[i];
  243.         tab3[i - 1] = kop[i];
  244.         tab4[i - 1] = kop[i];
  245.     }
  246.  
  247.     for (int i = ile / 2; i <= ile; i++)
  248.     {
  249.         kop[i] = rand() % 10000 + 1050;
  250.         tab[i - 1] = kop[i];
  251.         tab1[i - 1] = kop[i];
  252.         tab2[i - 1] = kop[i];
  253.         tab3[i - 1] = kop[i];
  254.         tab4[i - 1] = kop[i];
  255.     }
  256.  
  257.  
  258.     cout << endl << "Sortuje babelkowo. Prosze czekac!" << endl;
  259.     start = clock();
  260.     bsortopt(tab, ile, zamiana, porownanie);
  261.     stop = clock();
  262.     czas = (double)(stop - start) / CLOCKS_PER_SEC;
  263.     cout << endl << "Czas sortowania babelkowego opt: " << czas << " s" << endl << "Ilosc porownan: " << porownanie << endl << "Ilosc zamian: " << zamiana << endl;
  264.  
  265.     zamiana = 0; porownanie = 0;
  266.  
  267.     cout << endl << "Sortuje quicksort. Prosze czekac!" << endl;
  268.     start = clock();
  269.     quicksort(tab1, 0, ile - 1, zamiana, porownanie);
  270.     stop = clock();
  271.     czas = (double)(stop - start) / CLOCKS_PER_SEC;
  272.     cout << endl << "Czas sortowania quicksort: " << czas << " s" << endl << "Ilosc porownan: " << porownanie << endl << "Ilosc zamian: " << zamiana << endl;
  273.  
  274.     zamiana = 0; porownanie = 0;
  275.  
  276.     cout << endl << "Sortuje przez kopcowanie. Prosze czekac!" << endl;
  277.     start = clock();
  278.     kopiec(kop, ile, zamiana, porownanie);
  279.     stop = clock();
  280.     czas = (double)(stop - start) / CLOCKS_PER_SEC;
  281.     cout << endl << "Czas sortowania przez kopcowanie: " << czas << " s" << endl << "Ilosc porownan: " << porownanie << endl << "Ilosc zamian: " << zamiana << endl;
  282.  
  283.     zamiana = 0; porownanie = 0;
  284.  
  285.     cout << endl << "Sortowanie przez wybieranie. Prosze czekac!" << endl;
  286.     start = clock();
  287.     wybieranie(tab2, ile, zamiana, porownanie);
  288.     stop = clock();
  289.     czas = (double)(stop - start) / CLOCKS_PER_SEC;
  290.     cout << endl << "Czas sortowania przez wybieranie: " << czas << " s" << endl << "Ilosc porownan: " << porownanie << endl << "Ilosc zamian: " << zamiana << endl;
  291.  
  292.     zamiana = 0; porownanie = 0;
  293.  
  294.     cout << endl << "Sortowanie przez wstawianie. Prosze czekac!" << endl;
  295.     start = clock();
  296.     wstawianie(tab3, ile, zamiana, porownanie);
  297.     stop = clock();
  298.     czas = (double)(stop - start) / CLOCKS_PER_SEC;
  299.     cout << endl << "Czas sortowania przez wstawianie: " << czas << " s" << endl << "Ilosc porownan: " << porownanie << endl << "Ilosc zamian: " << zamiana << endl;
  300.  
  301.     zamiana = 0; porownanie = 0;
  302.  
  303.     cout << endl << "Sortowanie przez scalanie. Prosze czekac!" << endl;
  304.     start = clock();
  305.     mergesort(tab4, 0, ile - 1, pom, zamiana, porownanie);
  306.     stop = clock();
  307.     czas = (double)(stop - start) / CLOCKS_PER_SEC;
  308.     cout << endl << "Czas sortowania przez scalanie: " << czas << " s" << endl << "Ilosc porownan: " << porownanie << endl << "Ilosc zamian: " << zamiana << endl;
  309.  
  310.     zamiana = 0; porownanie = 0;
  311.  
  312.     delete[] tab4;
  313.     delete[] tab3;
  314.     delete[] kop;
  315.     delete[] tab2;
  316.     delete[] tab;
  317.     delete[] tab1;
  318.     cout << endl;
  319.     system("PAUSE");
  320. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement