Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <iostream>
  4. #include <cstdlib>
  5. #include <chrono>
  6.  
  7. using namespace std;
  8. const int arr_size = 10000;
  9. const int col_razr = 3;
  10.  
  11. int velich_razr(int chislo, int razr)
  12. {
  13.     while (razr>1)
  14.     {
  15.         chislo /= 10;
  16.         razr--;
  17.     }
  18.     return chislo % 10;
  19. }
  20.  
  21. void sort_razr(int** tempArray, int* mas, int razr, int* mas_col)
  22. {
  23.     int temp = 0, a = 0;
  24.  
  25.     for (int i = 0; i < arr_size; i++)
  26.     {
  27.         mas_col[i] = 0;
  28.     }
  29.  
  30.     for (int i = 1; i < arr_size; i++)
  31.     {
  32.         a = velich_razr(mas[i], razr);
  33.         tempArray[mas_col[a]][a] = mas[i];
  34.         mas_col[a]++;
  35.     }
  36.  
  37.     for (int i = 0; i < arr_size; i++)
  38.     {
  39.         for (int j = 0; j < mas_col[i]; j++)
  40.         {
  41.             mas[temp] = tempArray[j][i];
  42.             temp++;
  43.         }
  44.     }
  45. }
  46.  
  47. ////////////////////////////
  48.  
  49. void Merge(int *A, int first, int last)
  50. {
  51.     int middle, start, final;
  52.     int *arr = new int[arr_size];
  53.  
  54.     middle = (first + last) / 2;                        //вычисление среднего элемента
  55.     start = first;                                      //начало левой части
  56.     final = middle + 1;                                 //начало правой части
  57.  
  58.     for (int j = first; j <= last; j++)                 //выполнять от начала до конца
  59.     {
  60.         if ((start <= middle) && ((final > last) || (A[start] < A[final])))
  61.         {
  62.             arr[j] = A[start];
  63.             start++;
  64.         }
  65.         else
  66.         {
  67.             arr[j] = A[final];
  68.             final++;
  69.         }
  70.     }
  71.  
  72.     //возвращение результата в список
  73.  
  74.     for (int j = first; j <= last; j++)
  75.     {
  76.         A[j] = arr[j];
  77.     }
  78.  
  79.     delete[]arr;
  80. };
  81.  
  82. //рекурсивная процедура сортировки
  83.  
  84. void MergeSort(int *A, int first, int last)
  85. {
  86.     {
  87.         if (first<last)
  88.         {
  89.             MergeSort(A, first, (first + last) / 2);    //сортировка левой части
  90.             MergeSort(A, (first + last) / 2 + 1, last); //сортировка правой части
  91.             Merge(A, first, last);                      //слияние двух частей
  92.         }
  93.     }
  94. };
  95.  
  96.  
  97. void main() {
  98.  
  99.     int razr;
  100.     int* mas_col = new int[arr_size];
  101.     int** tempArray = new int*[arr_size];
  102.     int* mainArray = new int[arr_size];
  103.     int* secondMainArray = new int[arr_size];
  104.  
  105.  
  106.     for (int i = 1; i <= arr_size - 1; i++)
  107.     {
  108.         mainArray[i] = rand() % 1000;           // запись случайного числа до 1000, которое вернет rand()      
  109.         secondMainArray[i] = mainArray[i];
  110.     }
  111.    
  112.     for (int i = 0; i < arr_size; i++)
  113.     {
  114.         tempArray[i] = new int[arr_size];
  115.     }
  116.  
  117.     auto firstSortStart = chrono::steady_clock::now();
  118.  
  119.     for (razr = 1; razr < 4; razr++)
  120.     {
  121.         sort_razr(tempArray, mainArray, razr, mas_col);
  122.     }  
  123.  
  124.     printf("\nFirst sorting:\n");
  125.  
  126.     for (int i = 0; i <= arr_size - 1; i++)
  127.     {
  128.         //cout << mainArray[i] << endl;
  129.         cout << ".";
  130.     }  
  131.  
  132.     auto firstSortEnd = chrono::steady_clock::now();
  133.  
  134.     auto secondSortStart = chrono::steady_clock::now();
  135.  
  136.     MergeSort(secondMainArray, 0, arr_size - 1);
  137.  
  138.     printf("\nSecond sorting:\n");
  139.  
  140.     for (int i = 0; i <= arr_size - 1; i++)
  141.     {
  142.         //cout << secondMainArray[i] << endl;
  143.  
  144.         cout << ".";
  145.     }
  146.  
  147.     auto secondSortEnd = chrono::steady_clock::now();
  148.  
  149.     auto elapsed_ms1 = chrono::duration_cast<chrono::milliseconds>(firstSortEnd - firstSortStart);
  150.     auto elapsed_ms2 = chrono::duration_cast<chrono::milliseconds>(secondSortEnd - secondSortStart);
  151.  
  152.     cout << "\nFirst sort time: " << elapsed_ms1.count() << " ms\n";
  153.     cout << "\nSecond sort time: " << elapsed_ms2.count() << " ms\n";
  154.  
  155.     for (int i = 0; i < arr_size; i++) {
  156.         delete[] tempArray[i];
  157.     }
  158.  
  159.     delete[] mas_col;
  160.     delete[] mainArray;
  161.     delete[] secondMainArray;
  162.     delete[] tempArray;
  163.  
  164.     system("pause");
  165.    
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement