Advertisement
Guest User

Untitled

a guest
May 29th, 2015
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.85 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <time.h>
  4. #include <windows.h>
  5. #include <locale.h>
  6.  
  7. #define TEST_MASS_SIZE   5000 //количество
  8.  
  9. void task1();
  10. void task2();
  11. void fillArray(int* massiv, int size);
  12. void ZeroizingMyMass(int *piMyMass);
  13. void printArray(const int* massiv, int size, FILE* stream);
  14. void printArray(const int* massiv, int size);
  15. void readArray(int* massiv, int size, FILE* stream);
  16. void copyArray(const int* src, int* dest, int size);
  17. void SortVstavki(int *piMyMass, int iCardinality);
  18. void SortShell(int *piMyMass, int iCardinality);
  19. void SortSliyaniya(int *piMyMass, int iFirst, int iLast);
  20. void vSortSl(int *piMyMass, int iFirst, int iLast);
  21.  
  22.  
  23. void main(void)
  24. {
  25.     setlocale(0,"");
  26.     unsigned int time1=time(NULL);
  27.     srand(time1^(time1<<24));
  28.    
  29.     //task1();
  30.     task2();
  31.    
  32.     system("pause");
  33. }
  34.  
  35.  
  36. void task1()
  37. {
  38.     int* firstArray = new int[TEST_MASS_SIZE];
  39.     int* secondArray = new int[TEST_MASS_SIZE];
  40.     int* thirdArray = new int[TEST_MASS_SIZE];
  41.  
  42.     fillArray(firstArray, TEST_MASS_SIZE);
  43.     fillArray(secondArray, TEST_MASS_SIZE);
  44.     fillArray(thirdArray, TEST_MASS_SIZE);
  45.  
  46.     printf("МАССИВЫ ДО СОРТИРОВКИ\n");
  47.     printf("Первый масссив: \n");
  48.     printArray(firstArray, TEST_MASS_SIZE);
  49.     printf("Второй масссив: \n");
  50.     printArray(secondArray, TEST_MASS_SIZE);
  51.     printf("Третий масссив: \n");
  52.     printArray(thirdArray, TEST_MASS_SIZE);
  53.  
  54.     FILE* beforeOut = fopen("arrays.txt", "w");
  55.     if (beforeOut == NULL)
  56.     {
  57.         fprintf(stderr, "Не открывается arrays.txt");
  58.         return;
  59.     }
  60.     printArray(firstArray, TEST_MASS_SIZE, beforeOut);
  61.     printArray(secondArray, TEST_MASS_SIZE, beforeOut);
  62.     printArray(thirdArray, TEST_MASS_SIZE, beforeOut);
  63.     fclose(beforeOut);
  64.  
  65.     ZeroizingMyMass(firstArray);
  66.     ZeroizingMyMass(secondArray);
  67.     ZeroizingMyMass(thirdArray);
  68.  
  69.     FILE* in = fopen("arrays.txt", "r");
  70.     if (in == NULL)
  71.     {
  72.         fprintf(stderr, "Не открывается arrays.txt");
  73.         return;
  74.     }
  75.     readArray(firstArray, TEST_MASS_SIZE, in);
  76.     readArray(secondArray, TEST_MASS_SIZE, in);
  77.     readArray(thirdArray, TEST_MASS_SIZE, in);
  78.     fclose(in);
  79.  
  80.     SortVstavki(firstArray, TEST_MASS_SIZE);
  81.     SortShell(secondArray, TEST_MASS_SIZE);
  82.     vSortSl(thirdArray, 0, TEST_MASS_SIZE-1);
  83.  
  84.     fprintf(stdout, "МАССИВЫ ПОСЛЕ СОРТИРОВКИ\n");
  85.     fprintf(stdout, "Сортировка вставками: \n");
  86.     printArray(firstArray, TEST_MASS_SIZE);
  87.     fprintf(stdout, "Сортировка Шелла: \n");
  88.     printArray(secondArray, TEST_MASS_SIZE);
  89.     fprintf(stdout, "Сортировка слияниями: \n");
  90.     printArray(thirdArray, TEST_MASS_SIZE);
  91.  
  92.     FILE* afterOut = fopen("sortArrays.txt", "w");
  93.     if (afterOut == NULL)
  94.     {
  95.         fprintf(stderr, "Не открывается sortArrays.txt");
  96.         return;
  97.     }
  98.     fprintf(afterOut, "Сортировка вставками: \n");
  99.     printArray(firstArray, TEST_MASS_SIZE, afterOut);
  100.     fprintf(afterOut, "Сортировка Шелла: \n");
  101.     printArray(secondArray, TEST_MASS_SIZE, afterOut);
  102.     fprintf(afterOut, "Сортировка слияниями: \n");
  103.     printArray(thirdArray, TEST_MASS_SIZE, afterOut);
  104.     fclose(afterOut);
  105.  
  106.     delete[] firstArray;
  107.     delete[] secondArray;
  108.     delete[] thirdArray;
  109. }
  110.  
  111.  
  112. void task2()
  113. {
  114.     unsigned int t1, t2, sortTime;
  115.     int sizes[] = {8000, 16000, 32000, 64000, 128000, 256000, 512000, 700000};
  116.  
  117.     for (int i = 0; i < 8; ++i)
  118.     {
  119.         unsigned int minTime = 10000000000;
  120.         unsigned int maxTime = 0;
  121.         unsigned int sumTime = 0;
  122.  
  123.         int size = sizes[i];
  124.         int* Mas = new int[size];
  125.         fillArray(Mas, size);
  126.    
  127.         for (int j = 0; j < 100; ++j)
  128.         {
  129.             t1 = 0; t2 = 0; sortTime = 0;
  130.             int* vstavkiSortArray = new int[size];
  131.             copyArray(Mas, vstavkiSortArray, size);
  132.             t1 = GetTickCount();
  133.             SortVstavki(vstavkiSortArray, size);
  134.             t2 = GetTickCount();
  135.             sortTime = t2 - t1;
  136.  
  137.             if (sortTime > maxTime) {maxTime = sortTime;}
  138.             if (sortTime < minTime) {minTime = sortTime;}
  139.             sumTime += sortTime;
  140.  
  141.             delete[] vstavkiSortArray;
  142.         }
  143.         sumTime/=100;
  144.         fprintf(stdout, "Сортировка вставками: максимум = %d минимум = %d среднее = %d\n", maxTime, minTime, sumTime);
  145.  
  146.         minTime = 10000000000; maxTime = 0; sumTime = 0;
  147.    
  148.         for (int j = 0; j < 100; ++j)
  149.         {
  150.             t1 = 0; t2 = 0; sortTime = 0;
  151.             int* shellSortArray = new int[size];
  152.             copyArray(Mas, shellSortArray, size);
  153.             t1 = GetTickCount();
  154.             SortShell(shellSortArray, size);
  155.             t2 = GetTickCount();
  156.             sortTime = t2 - t1;
  157.  
  158.             if (sortTime > maxTime) {maxTime = sortTime;}
  159.             if (sortTime < minTime) {minTime = sortTime;}
  160.             sumTime += sortTime;
  161.  
  162.             delete[] shellSortArray;
  163.         }
  164.         sumTime/=100;
  165.         fprintf(stdout, "Сортировка     Шелла: максимум = %d минимум = %d среднее = %d\n", maxTime, minTime, sumTime);
  166.    
  167.         minTime = 10000000000; maxTime = 0; sumTime = 0;
  168.  
  169.         for (int j = 0; j < 100; ++j)
  170.         {
  171.             t1 = 0; t2 = 0; sortTime = 0;
  172.             int* sliyaniyaSortArray = new int[size];
  173.             copyArray(Mas, sliyaniyaSortArray, size);
  174.             t1 = GetTickCount();
  175.             vSortSl(sliyaniyaSortArray, 0, size-1);
  176.             t2 = GetTickCount();
  177.             sortTime = t2 - t1;
  178.  
  179.             if (sortTime > maxTime) {maxTime = sortTime;}
  180.             if (sortTime < minTime) {minTime = sortTime;}
  181.             sumTime += sortTime;
  182.  
  183.             delete[] sliyaniyaSortArray;
  184.         }
  185.         sumTime/=100;
  186.         fprintf(stdout, "Сортировка слиянием: максимум = %d минимум = %d среднее = %d\n\n", maxTime, minTime, sumTime);
  187.    
  188.         delete[] Mas;
  189.     }
  190. }
  191.  
  192.  
  193. void ZeroizingMyMass(int *piMyMass)
  194. {
  195.     for (int i=0; i<TEST_MASS_SIZE; i++) piMyMass[i]=0;
  196. }
  197.  
  198.  
  199. void fillArray(int* massiv, int size)
  200. {
  201.     for (int i = 0; i<size; i++)
  202.     {
  203.         int randomValue = rand()%21-10;
  204.         massiv[i] = randomValue;
  205.     }
  206. }
  207.  
  208.  
  209. void printArray(const int* massiv, int size, FILE* stream)
  210. {
  211.     for (int i = 0; i < size; ++i)
  212.     {
  213.         fprintf(stream, "%2d ", massiv[i]);
  214.         if ((i + 1) % 10 == 0)
  215.         {
  216.             fprintf(stream, "\n");
  217.         }
  218.     }
  219.     fprintf(stream, "\n");
  220. }
  221.  
  222.  
  223. void printArray(const int* massiv, int size)
  224. {
  225.     printArray(massiv, size, stdout);
  226. }
  227.  
  228.  
  229. void readArray(int* massiv, int size, FILE* stream)
  230. {
  231.     for (int i = 0; i < size; ++i)
  232.     {
  233.         fscanf(stream, "%d", massiv + i);
  234.     }
  235. }
  236.  
  237.  
  238. void copyArray(const int* src, int* dest, int size)
  239. {
  240.     for (int i = 0; i < size; ++i)
  241.     {
  242.         dest[i] = src[i];
  243.     }
  244. }
  245.  
  246.  
  247. void SortVstavki(int *piMyMass, int iCardinality)
  248. {
  249.     int tmp;
  250.     int i,j;
  251.     for (i=1; i < iCardinality; i++)
  252.     {
  253.         tmp = piMyMass[i];
  254.         for (j=i-1; j>=0 && piMyMass[j]>tmp; j--)
  255.             piMyMass[j+1] = piMyMass[j];
  256.         piMyMass[j+1] = tmp;
  257.     }
  258. }
  259.  
  260.  
  261. void SortShell(int *piMyMass, int iCardinality)
  262. {
  263.     int gap;
  264.     int tmp;
  265.     int i,j;
  266.     for (gap = iCardinality/2; gap>0; gap/=2)
  267.         for (i=gap; i<iCardinality; i++)
  268.             for (j=i-gap; j>=0 && piMyMass[j] > piMyMass[j+gap]; j-=gap)
  269.             {
  270.                 tmp = piMyMass[j];
  271.                 piMyMass[j] = piMyMass[j+gap];
  272.                 piMyMass[j+gap] = tmp;
  273.             }
  274. }
  275.  
  276.  
  277. void SortSliyaniya(int *piMyMass, int iFirst, int iLast)
  278. {
  279.     int iMid, iStart, iFinish, j = 0;
  280.     int *piNewMas = new int[iLast - iFirst + 1];
  281.     iMid = (iFirst + iLast) / 2;                        // вычисление среднего элемента
  282.     iStart = iFirst;                                    // начало левой части
  283.     iFinish = iMid + 1;                                 // начало правой части
  284.     while ((iStart <= iMid) && (iFinish <= iLast))      // идет слияние, пока есть хоть один элемент в каждой последовательности
  285.     {
  286.         if (piMyMass[iStart] > piMyMass[iFinish])
  287.             piNewMas[j++] = piMyMass[iFinish++];
  288.         else
  289.             piNewMas[j++] = piMyMass[iStart++];
  290.     }
  291.  
  292.     // одна последовательность закончилась - копировать остаток другой в конец буфера
  293.     while (iFinish <= iLast)                                // пока вторая последовательность непуста
  294.         piNewMas[j++] = piMyMass[iFinish++];
  295.     while (iStart <= iMid)                                  // пока первая последовательность непуста
  296.         piNewMas[j++] = piMyMass[iStart++];
  297.  
  298.     for (j = 0; j < iLast - iFirst +1; j++)                // возвращение результата в основной массив
  299.         piMyMass[iFirst+j] = piNewMas[j];
  300.     delete piNewMas;
  301. }
  302.  
  303. void vSortSl(int *piMyMass, int iFirst, int iLast)
  304. {
  305.     if (iFirst < iLast)
  306.     {
  307.         vSortSl(piMyMass, iFirst, (iFirst + iLast) / 2);         // сортировка левой части
  308.         vSortSl(piMyMass, (iFirst + iLast) / 2 + 1, iLast);      // сортировка правой части
  309.         SortSliyaniya(piMyMass, iFirst, iLast);                       // слияние двух частей
  310.     }
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement