Advertisement
believe_me

Untitled

Nov 8th, 2021
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.87 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>
  4. #include <cstdlib>
  5.  
  6. int InputN()
  7. {
  8.     int n;
  9.     std::cout << "Enter size of source array, n: ";
  10.     std::cin >> n;
  11.     std::cin.ignore(32767, '\n');
  12.     return n;
  13. }
  14.  
  15. void MatrixZeroing(int** matrix_of_sorted_parts_sizes, int n)
  16. {
  17.     int counter = n / 2 + 1;
  18.     for (int i = 0; i < counter; i++)
  19.     {
  20.         matrix_of_sorted_parts_sizes[0][i] = 0;
  21.         matrix_of_sorted_parts_sizes[1][i] = 0;
  22.     }
  23. }
  24.  
  25. int FindPositionToWrite(int** matrix_of_sorted_parts_sizes, int n, int condition)
  26. {
  27.     for (int i = 0; i < n; i++)
  28.     {
  29.         switch (condition)
  30.         {
  31.         case 1:
  32.             if (matrix_of_sorted_parts_sizes[0][i] == 0)
  33.             {
  34.                 return i;
  35.             }
  36.             break;
  37.         case 2:
  38.             if (matrix_of_sorted_parts_sizes[1][i] == 0)
  39.             {
  40.                 return i;
  41.             }
  42.             break;
  43.         }
  44.     }
  45. }
  46.  
  47. bool FindConditionOfSorted(int* f, int n)
  48. {
  49.     int counter = 0;
  50.     for (int i = 1; i < n; i++)
  51.     {
  52.         if (f[i - 1] <= f[i])
  53.         {
  54.             counter++;
  55.         }
  56.     }
  57.     if (counter + 1 == n)
  58.     {
  59.         return 1;
  60.     }
  61.     else
  62.     {
  63.         return 0;
  64.     }
  65. }
  66.  
  67. void FillingSourceArrayByRandomNumbers(int* source_array, int n)
  68. {
  69.     for (int i = 0; i < n; i++)
  70.     {
  71.         source_array[i] = rand() % 41 - 20;
  72.     }
  73. }
  74.  
  75. void CreatingFirstF(int* f, int* source_array, int n)
  76. {
  77.     for (int i = 0; i < n; i++)
  78.     {
  79.         f[i] = source_array[i];
  80.     }
  81. }
  82.  
  83. void CreatingSortedArray(int* sorted_array, int* f, int n)
  84. {
  85.     for (int i = 0; i < n; i++)
  86.     {
  87.         sorted_array[i] = f[i];
  88.     }
  89. }
  90.  
  91. int FindNumberOfPairs(int** matrix_of_sorted_parts_sizes, int n)
  92. {
  93.     int counter = 0;
  94.     for (int i = 0; i < n / 2 + 1; i++)
  95.     {
  96.  
  97.         if (matrix_of_sorted_parts_sizes[0][i] == 0)
  98.         {
  99.             return i;
  100.         }
  101.     }
  102.     return n / 2 + 1;
  103. }
  104.  
  105. void FindSortedPart(int* f, int* sort, int n, int* index, int* length)
  106. {
  107.     int k = 0;
  108.     for (int i = *index; i < n; i++)
  109.     {
  110.         if (f[i] <= f[i + 1])
  111.         {
  112.             k++;
  113.         }
  114.         else
  115.         {
  116.             break;
  117.         }
  118.     }
  119.     if (k > 0)
  120.     {
  121.         int l = 0;
  122.         for (int i = *index; i < *index + k + 1; i++)
  123.         {
  124.             sort[l] = f[i];
  125.             l++;
  126.         }
  127.     }
  128.     else
  129.     {
  130.         sort[0] = f[*index];
  131.     }
  132.     *length = k + 1;
  133.     *index += *length;
  134. }
  135.  
  136. void FillF1(int** matrix_of_sorted_parts_sizes, int* f1, int* sort, int n, int length, int* index_f)
  137. {
  138.     for (int i = *index_f; i < *index_f + length; i++)
  139.     {
  140.         f1[i] = sort[i - *index_f];
  141.     }
  142.     int posnum = FindPositionToWrite(matrix_of_sorted_parts_sizes, n, 1);
  143.     matrix_of_sorted_parts_sizes[0][posnum] = length;
  144.     *index_f += length;
  145. }
  146.  
  147. void FillF2(int** matrix_of_sorted_parts_sizes, int* f2, int* sort, int n, int length, int* index_f)
  148. {
  149.     for (int i = *index_f; i < *index_f + length; i++)
  150.     {
  151.         f2[i] = sort[i - *index_f];
  152.     }
  153.     int posnum = FindPositionToWrite(matrix_of_sorted_parts_sizes, n, 2);
  154.     matrix_of_sorted_parts_sizes[1][posnum] = length;
  155.     *index_f += length;
  156. }
  157.  
  158. void FillingFs(int** matrix_of_sorted_parts_sizes, int* f, int* f1, int* f2, int n)
  159. {
  160.     MatrixZeroing(matrix_of_sorted_parts_sizes, n);
  161.     int index = 0;
  162.     int index_f = 0;
  163.     int length = 0;
  164.     int condition = 0;
  165.     int* sort = new int[n];
  166.     for (int i = 0; i < n; i += length)
  167.     {
  168.         FindSortedPart(f, sort, n, &index, &length);
  169.         if (condition % 2 == 0)
  170.         {
  171.             FillF1(matrix_of_sorted_parts_sizes, f1, sort, n, length, &index_f);
  172.         }
  173.         else
  174.         {
  175.             FillF2(matrix_of_sorted_parts_sizes, f2, sort, n, length, &index_f);
  176.         }
  177.         condition++;
  178.     }
  179.     delete[] sort;
  180. }
  181.  
  182. void FindingNewF(int** matrix_of_sorted_parts_sizes, int* f, int* f1, int* f2, int n)
  183. {
  184.     FillingFs(matrix_of_sorted_parts_sizes, f, f1, f2, n);
  185.     int counter = FindNumberOfPairs(matrix_of_sorted_parts_sizes, n);
  186.     int index = 0;
  187.     for (int i = 0; i < counter; i++)
  188.     {
  189.         int size1 = matrix_of_sorted_parts_sizes[0][i];
  190.         int size2 = matrix_of_sorted_parts_sizes[1][i];
  191.         int j1 = index;
  192.         int j2 = index + size1;
  193.         int z = index;
  194.         do
  195.         {
  196.             if ((j1 == index + size1) && (j2 != index + size1 + size2))
  197.             {
  198.                 for (j2; j2 < size1 + size2 + index; j2++)
  199.                 {
  200.                     f[z] = f2[j2];
  201.                     z++;
  202.                 }
  203.                 break;
  204.             }
  205.             if ((j2 == index + size1 + size2) && (j1 != index + size1))
  206.             {
  207.                 for (j1; j1 < size1 + index; j1++)
  208.                 {
  209.                     f[z] = f1[j1];
  210.                     z++;
  211.                 }
  212.                 break;
  213.             }
  214.             if ((f1[j1] < f2[j2]) && (j2 < n) && (j1 < n))
  215.             {
  216.                 f[z] = f1[j1];
  217.                 j1++;
  218.                 z++;
  219.                 continue;
  220.             }
  221.             if ((f2[j2] < f1[j1]) && (j2 < n) && (j1 < n))
  222.             {
  223.                 f[z] = f2[j2];
  224.                 j2++;
  225.                 z++;
  226.                 continue;
  227.             }
  228.             if ((f2[j2] == f1[j1]) && (j2 < n) && (j1 < n))
  229.             {
  230.                 f[z] = f1[j1];
  231.                 z++;
  232.                 f[z] = f2[j2];
  233.                 j1++;
  234.                 j2++;
  235.                 z++;
  236.                 continue;
  237.             }
  238.         } while (z < index + size1 + size2);
  239.         index += size1 + size2;
  240.     }
  241. }
  242.  
  243. void Sorting(int* source_array, int* sorted_array, int n)
  244. {
  245.     int** matrix_of_sorted_parts_sizes = new int* [2];
  246.     for (int i = 0; i < 2; i++)
  247.     {
  248.         matrix_of_sorted_parts_sizes[i] = new int[n / 2 + 1];
  249.     }
  250.     int* f = new int[n];
  251.     int* f1 = new int[n];
  252.     int* f2 = new int[n];
  253.     CreatingFirstF(f, source_array, n);
  254.     while (!FindConditionOfSorted(f, n))
  255.     {
  256.         FindingNewF(matrix_of_sorted_parts_sizes, f, f1, f2, n);
  257.     }
  258.     CreatingSortedArray(sorted_array, f, n);
  259.     for (int i = 0; i < 2; i++)
  260.     {
  261.         delete[] matrix_of_sorted_parts_sizes[i];
  262.     }
  263.     delete[] matrix_of_sorted_parts_sizes;
  264.     delete[] f;
  265.     delete[] f1;
  266.     delete[] f2;
  267. }
  268.  
  269. void PrintSourceArray(int* source_array, int n)
  270. {
  271.     std::cout << "Source array:\n";
  272.     for (int i = 0; i < n; i++)
  273.     {
  274.         std::cout << std::setw(6) << source_array[i];
  275.     }
  276.     std::cout << std::endl;
  277. }
  278.  
  279. void PrintSortedArray(int* sorted_array, int n)
  280. {
  281.     std::cout << "Sorted array:\n";
  282.     for (int i = 0; i < n; i++)
  283.     {
  284.         std::cout << std::setw(6) << sorted_array[i];
  285.     }
  286. }
  287.  
  288. int main()
  289. {
  290.     srand(time(NULL));
  291.     int n = InputN();
  292.     int* source_array = new int[n];
  293.     int* sorted_array = new int[n];
  294.     FillingSourceArrayByRandomNumbers(source_array, n);
  295.     PrintSourceArray(source_array, n);
  296.     Sorting(source_array, sorted_array, n);
  297.     PrintSortedArray(sorted_array, n);
  298.     delete[] source_array;
  299.     delete[] sorted_array;
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement