Advertisement
xgallom

Mejdi8

Nov 19th, 2019
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. // Maximum pre nahodnu generaciu
  5. #define MaxReal 9
  6. #define MaxImag 18
  7.  
  8. // Struktura komplexnych cisel
  9. struct Complex {
  10.     int real, imag;
  11.  
  12.     // Absolutna hodnota komplexneho cisla
  13.     double abs() const { return sqrt(real * real + imag * imag); }
  14.  
  15.     // Nastavenie komplexneho cisla na nahodnu hodnotu
  16.     void setRandom()
  17.     {
  18.         real = 1 + (rand() % MaxReal);
  19.         imag = 1 + (rand() % MaxImag);
  20.     }
  21. };
  22.  
  23. // Porovna dve komplexne cisla a vrati:
  24. //   -1 ak l < r
  25. //   0  ak l == r
  26. //   1  ak l > r
  27. int compare(const Complex *l, const Complex *r)
  28. {
  29.     const double labs = l->abs(), rabs = r->abs();
  30.  
  31.     if(labs > rabs)
  32.         return 1;
  33.     else if(labs < rabs)
  34.         return -1;
  35.     else
  36.         return 0;
  37. }
  38.  
  39. // Pretypovanie pre kniznicnu funkciu qsort
  40. int compare(const void *l, const void *r)
  41. {
  42.     return compare(*(const Complex **) l, *(const Complex **) r);
  43. }
  44.  
  45. // Nasa implementacia funkcie quick sort
  46. void quickSort(Complex **data, int left, int right)
  47. {
  48.     if(left >= right)
  49.         return;
  50.  
  51.     int i = left, j = right, m = (left + right) / 2;
  52.     Complex *p = data[m];
  53.  
  54.     do {
  55.         while(compare(p, data[i]) > 0)
  56.             ++i;
  57.  
  58.         while(compare(data[j], p) > 0)
  59.             --j;
  60.  
  61.         if(i <= j)
  62.             std::swap(data[i++], data[j--]);
  63.     } while(i <= j);
  64.  
  65.     quickSort(data, left, j);
  66.     quickSort(data, i, right);
  67. }
  68.  
  69. // Kontrola zoradenosti pola komplexnych cisel
  70. bool check(Complex **data, int n)
  71. {
  72.     for(int i = 0; i < n - 1; ++i)
  73.         if(compare(data[i], data[i + 1]) > 0)
  74.             return false;
  75.  
  76.     return true;
  77. }
  78.  
  79. // Kontrola zhodnosti dvoch poli komplexnych cisel
  80. bool check(Complex **data1, Complex **data2, int n)
  81. {
  82.     for(int i = 0; i < n; ++i)
  83.         if(compare(data1[i], data2[i]) > 0)
  84.             return false;
  85.  
  86.     return true;
  87. }
  88.  
  89. // Vypise pole komplexnych cisel
  90. void print(Complex **data, int n)
  91. {
  92.     for(int i = 0; i < n; ++i)
  93.         std::cout << "  " << data[i]->real << " + " << data[i]->imag << "i (" << data[i]->abs() << ")\n";
  94. }
  95.  
  96. int main()
  97. {
  98.     int n;
  99.  
  100.     // Nacitanie poctu prvkov
  101.     std::cout << "Zadaj pocet prvkov: ";
  102.     std::cin >> n;
  103.     std::cout << "\n";
  104.  
  105.     // Vytvorenie poli ukazovatelov na komplexne cisla
  106.     Complex **data1 = new Complex *[n];
  107.     Complex **data2 = new Complex *[n];
  108.  
  109.     // Nastavenie seedovacej hodnoty generatora nahodnych cisel
  110.     srand(time(nullptr));
  111.  
  112.     // Naplnenie pola nahodnymi komplexnymi cislami
  113.     for(int i = 0; i < n; ++i) {
  114.         data1[i] = new Complex;
  115.  
  116.         data1[i]->setRandom();
  117.         data2[i] = data1[i];
  118.     }
  119.  
  120.     // Vypisanie poli
  121.     std::cout << "data1:\n";
  122.     print(data1, n);
  123.  
  124.     std::cout << "data2:\n";
  125.     print(data2, n);
  126.  
  127.     // Zoradenie pola 1
  128.     {
  129.         const clock_t startTime = clock();
  130.  
  131.         quickSort(data1, 0, n - 1);
  132.  
  133.         const clock_t endTime = clock();
  134.  
  135.         bool isValid = check(data1, n);
  136.  
  137.         std::cout
  138.                 << "Usporiadanie pomocou vlastnej funkcie quickSort:\n"
  139.                 << "  cas: " << ((endTime - startTime) * 1e6 / CLOCKS_PER_SEC) << " us\n"
  140.                 << "  spravne: " << isValid << "\n"
  141.                 << "\n";
  142.     }
  143.  
  144.     // Zoradenie pola 2
  145.     {
  146.         const clock_t startTime = clock();
  147.  
  148.         std::qsort(data2, n, sizeof(Complex *), compare);
  149.  
  150.         const clock_t endTime = clock();
  151.  
  152.         bool isValid = check(data2, n);
  153.  
  154.         std::cout
  155.                 << "Usporiadanie pomocou kniznicnej funkcie qsort:\n"
  156.                 << "  cas: " << ((endTime - startTime) * 1e6 / CLOCKS_PER_SEC) << " us\n"
  157.                 << "  spravne: " << isValid << "\n"
  158.                 << "\n";
  159.     }
  160.  
  161.     // Kontrola zhody poli
  162.     std::cout << "Zhoda medzi prvkami data1 a data2: " << check(data1, data2, n) << "\n\n";
  163.  
  164.     // Vypis zoradenych poli
  165.     std::cout << "usporiadane data1:\n";
  166.     print(data1, n);
  167.  
  168.     std::cout << "usporiadane data2:\n";
  169.     print(data2, n);
  170.  
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement