Advertisement
majczel23000

[AiSD] 2. Sortowanie

Nov 29th, 2017
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <math.h>
  5. using namespace std;
  6.  
  7. const int N = 10;
  8. int tab[N]={};
  9. int mergeTab[N];
  10. int pozTab[N];
  11.  
  12. void wypelnij()
  13. {
  14.     srand( time( NULL ) );
  15.     for(int i = 0; i< N; i++)
  16.         tab[i] = rand()%N;
  17. }
  18.  
  19. void wypelnijPoz()
  20. {
  21.     srand( time( NULL ) );
  22.     for(int i = 0; i< N; i++)
  23.         pozTab[i] = rand()%899+100;
  24. }
  25.  
  26. void wypisz(int tab[])
  27. {
  28.     for(int i = 0; i< N; i++)
  29.         cout<<tab[i]<<" ";
  30.     cout<<endl;
  31. }
  32.  
  33. void proste_wybieranie()
  34. {
  35.     cout<<"[PROSTE WYBIERANIE] \t";
  36.     int minimum;
  37.     for(int i = 0; i < N-1; i++)
  38.     {
  39.         minimum = i;
  40.         for(int j = i+1; j < N; j++)
  41.             if(tab[j] < tab[minimum])
  42.                 minimum = j;
  43.         swap(tab[i],tab[minimum]);
  44.     }
  45. }
  46.  
  47. void proste_wstawianie()
  48. {
  49.     cout<<"[PROSTE WSTAWIANIE] \t";
  50.     int x, j;
  51.     for(int i = 1; i < N; i++)
  52.     {
  53.         x = tab[i];
  54.         j = i - 1;
  55.         while(j >= 0 && x < tab[j])
  56.         {
  57.             tab[j+1] = tab[j];
  58.             j -= 1;
  59.         }
  60.         tab[j+1] = x;
  61.     }
  62. }
  63.  
  64. void prosta_zamiana()
  65. {
  66.     cout<<"[PROSTA ZAMIANA] \t";
  67.     for(int i = 1; i < N; i++)
  68.         for(int j = N-1; j >= i; j--)
  69.             if(tab[j] < tab[j-1])
  70.                 swap(tab[j],tab[j-1]);
  71. }
  72.  
  73. void przez_zliczanie()
  74. {
  75.     cout<<"[PRZEZ ZLICZANIE] \t";
  76.     int C[N]={};
  77.     int tab2[N]={};
  78.     for(int i = 0; i < N; i++)
  79.         C[tab[i]] += 1;
  80.     for(int i = 1; i < N; i++)
  81.         C[i] += C[i-1];
  82.     for(int i = N-1; i>=0; i--)
  83.     {
  84.         tab2[C[tab[i]]-1] = tab[i];
  85.         C[tab[i]] -= 1;
  86.     }
  87.     wypisz(tab2);
  88. }
  89.  
  90. int podzial(int lewy, int prawy)
  91. {
  92.     int x = tab[lewy];
  93.     int i = lewy;
  94.     int j = prawy;
  95.     while(true)
  96.     {
  97.         while(tab[j] > x)
  98.             j--;
  99.         while(tab[i] < x)
  100.             i++;
  101.         if(i < j)
  102.         {
  103.             swap(tab[i],tab[j]);
  104.             i++;
  105.             j--;
  106.         }
  107.         else
  108.             return j;   //pkt podzialu tablicy
  109.     }
  110. }
  111.  
  112. void QuickSort(int lewy, int prawy)
  113. {
  114.     if(lewy < prawy)
  115.     {
  116.         int p = podzial(lewy, prawy);
  117.         QuickSort(lewy, p);
  118.         QuickSort(p+1, prawy);
  119.     }
  120. }
  121.  
  122. void merge(int lewy, int prawy, int srodek)
  123. {
  124.     int i, j, q;
  125.     for(i = lewy; i<= prawy; i++)
  126.         mergeTab[i] = tab[i];
  127.     i = lewy;
  128.     j = srodek+1;
  129.     q = lewy;
  130.     while(i <= srodek && j <= prawy)
  131.     {
  132.         if(mergeTab[i] < mergeTab[j])
  133.             tab[q++] = mergeTab[i++];
  134.         else
  135.             tab[q++] = mergeTab[j++];
  136.     }
  137.     while(i <= srodek)
  138.         tab[q++] = mergeTab[i++];
  139. }
  140.  
  141. void mergeSort(int lewy, int prawy)
  142. {
  143.     if(lewy < prawy)
  144.     {
  145.         int srodek = (lewy + prawy)/2;
  146.         mergeSort(lewy, srodek);
  147.         mergeSort(srodek+1, prawy);
  148.         merge(lewy, prawy, srodek);
  149.     }
  150. }
  151.  
  152. void pozycyjne()
  153. {
  154.     int x, j;
  155.     for(int l = 0; l < 3; l++)
  156.     {
  157.         int x, j;
  158.         for(int i = 1; i < N; i++)
  159.         {
  160.             x = (int)(pozTab[i]/pow(10,l))%10;
  161.             j = i - 1;
  162.             while(j >= 0 && x < (int)(pozTab[j]/pow(10,l))%10)
  163.             {
  164.                 pozTab[j+1] = pozTab[j];
  165.                 j -= 1;
  166.             }
  167.             pozTab[j+1] = pozTab[i];
  168.         }
  169.         //
  170.         wypisz(pozTab);
  171.     }
  172. }
  173.  
  174. int main(){
  175.     clock_t poczatek;
  176.     clock_t koniec;
  177.     double wynik;
  178.  
  179.     wypelnij();
  180.     wypisz(tab);
  181.     poczatek = clock();
  182.     proste_wybieranie();
  183.     koniec = clock();
  184.     wynik = (double) (koniec - poczatek) /CLOCKS_PER_SEC;
  185.     cout<<"\t"<<wynik<<"\t";
  186.     wypisz(tab);
  187.  
  188.     wypelnij();
  189.     proste_wstawianie();
  190.     wypisz(tab);
  191.  
  192.     wypelnij();
  193.     prosta_zamiana();
  194.     wypisz(tab);
  195.  
  196.     wypelnij();
  197.     przez_zliczanie();
  198.  
  199.     cout<<"[SORTOWANIE SZYBKIE] \t";
  200.     wypelnij();
  201.     QuickSort(0, N-1);
  202.     wypisz(tab);
  203.  
  204.     cout<<"[PRZEZ SCALANIE] \t";
  205.     wypelnij();
  206.     mergeSort(0, N-1);
  207.     wypisz(tab);
  208.  
  209.     wypelnijPoz();
  210.     wypisz(pozTab);
  211.     pozycyjne();
  212.  
  213.  
  214.  
  215.     return 0;
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement