Advertisement
Stybyk

Olivkovo řešení

Oct 28th, 2014
503
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.09 KB | None | 0 0
  1. //
  2. // Demo program pro vyuku predmetu APPS (09/2011)
  3. // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
  4. //
  5. // Priklad pouzit vlaken v OS Windows
  6. // Pro overeni paralelismu je nutno mit alespon dvoujadrovy procesor
  7. //
  8. // ***********************************************************************
  9. #include <iostream>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <time.h>
  13. #include <windows.h>
  14. #include <tchar.h>
  15.  
  16. using namespace std;
  17.  
  18. #define TYP int
  19.  
  20. //------------ KONSTANTY ----------------
  21.  const int NAHODA = 200;
  22.  const int ARRAY_SIZE = 10;
  23.  int MAX1, MAX2;
  24.  int *POLE;
  25.  int *FIRST;
  26.  int *SECOND;
  27. //--------------------------------------
  28. // funkce rand() je pouze 16 bitova
  29. // rand32 vraci 32 bitove nahodne cislo
  30. int rand32()
  31. {
  32.     return rand() * RAND_MAX + rand();
  33. }
  34.  
  35. void PrintArray(int arr[], int size)
  36. {
  37. for(int i = 0; i<size; i++)
  38.    {
  39.       cout<<arr[i]<<endl;
  40.    }
  41.  
  42. }
  43.  
  44. //----------------FUNKCE START-----------------------
  45. void SelectionSort(int arr[], int size)
  46. {
  47.         int i, j, mi, tmp;
  48.         for (i = 0; i < size - 1; i++) {
  49.                 /* najdeme minimum */
  50.                 mi = i;
  51.                 for (j = i+1; j < size; j++) {
  52.                     if (arr[j] < arr[mi]) {
  53.                         mi = j;
  54.                     }
  55.                 }
  56.                 /* vyměníme arr[i] a arr[mi] */
  57.                 tmp = arr[i];
  58.                 arr[i] = arr[mi];
  59.                 arr[mi] = tmp;
  60.       //Pomocny vypis
  61.    //cout<<"Pruchod: "<<size-i<<endl;
  62.       //      PrintArray(arr,size);
  63.      
  64.       }
  65. }
  66.  
  67.  
  68. void InsertionSort(int arr[], int size) {
  69.  
  70.       int i, j, tmp;
  71.  
  72.       for (i = 1; i < size; i++) {
  73.  
  74.             tmp = arr[i];
  75.  
  76.             j = i;
  77.  
  78.             while (j > 0 && arr[j - 1] > tmp) {
  79.  
  80.                   arr[j] = arr[j - 1];
  81.  
  82.                   j--;
  83.  
  84.             }
  85.  
  86.             arr[j] = tmp;
  87. //Pomocny vypis
  88.    //cout<<"Pruchod: "<<size-i<<endl;
  89.       //      PrintArray(arr,size);
  90.      }
  91.  
  92. }
  93.  
  94. void BubbleSort(int arr[], int size)
  95. {
  96.   int i, j, temp;
  97.  
  98.   for (i = (size - 1); i > 0; i--)
  99.   {
  100.     for (j = 1; j <= i; j++)
  101.     {
  102.       if (arr[j-1] > arr[j])
  103.       {
  104.         temp = arr[j-1];
  105.         arr[j-1] = arr[j];
  106.         arr[j] = temp;
  107.       }
  108.     }
  109.    //Pomocny vypis
  110.    //cout<<"Pruchod: "<<size-i<<endl;
  111.       //      PrintArray(arr,size);
  112.  //Sleep(20);
  113.   }
  114. }
  115.  
  116.  
  117.  
  118. void CoppyArray(int arr1[], int arr2[], int size)
  119. {
  120. for(int i = 0; i<size; i++)
  121.    {
  122.       arr2[i]=arr1[i];
  123.    }
  124.  
  125. }
  126.  
  127. void SplitArray(int arr[],int arr1[], int arr2[], int size)
  128. {
  129.    int secondhalf = size-size/2;
  130. for(int i = 0; i<size; i++)
  131.    {
  132.      
  133.       if(i<(size/2))
  134.       {
  135.          arr1[i]=arr[i];
  136.       }
  137.       else
  138.       {
  139.          arr2[i-secondhalf]=arr[i];
  140.       }
  141.    }
  142.  
  143. }
  144.  
  145. void CombineArray(int arr[],int arr1[], int arr2[], int size)
  146. {
  147.    int secondhalf = size-size/2;
  148.    int j=0;
  149.    int k=0;
  150. for(int i = 0; i<size; i++)
  151.    {
  152.    
  153.       if((arr1[j]<arr2[k] && j<size/2) || k==secondhalf)
  154.       {
  155.          if(j<size/2)
  156.          {
  157.          arr[i]=arr1[j];
  158.          }
  159.          j++;
  160.       }
  161.       else
  162.       //if((arr2[k]<arr1[j] && k<secondhalf) || j==size)
  163.       {
  164.          if(j<secondhalf)
  165.          {
  166.          arr[i]=arr2[k];
  167.          }
  168.          k++;
  169.       }
  170.    
  171. }
  172. }
  173.  
  174. //TADY KONCI MOJE FUNKCE
  175. int hledej_max( int levy, int pravy, int *pole )
  176. {
  177.    int nejvetsi = pole[ levy ];
  178.    for ( int i = levy + 1; i < pravy; i++ )
  179.       if ( nejvetsi < pole[ i ] )
  180.          nejvetsi = pole[ i ];
  181.    Sleep( 5000 ); // Zpožďovač
  182.    return nejvetsi;
  183. }
  184. // vypocet casoveho intervalu v milisekundach
  185. int kolik_ms( LPFILETIME pred, LPFILETIME po )
  186. {
  187.    hyper pred64b = pred->dwHighDateTime;
  188.    pred64b = ( pred64b << 32 ) | pred->dwLowDateTime;
  189.    hyper po64b = po->dwHighDateTime;
  190.    po64b = ( po64b << 32 ) | po->dwLowDateTime;
  191.    // konverze 100ns -> 1ms
  192.    return ( int ) ( ( po64b - pred64b ) / 10000 );
  193. }
  194.  
  195. void HyperSelectionSort(int levy, int pravy, int *pole)
  196. {
  197.         int i, j, mi, tmp;
  198.       for ( int i = levy; i < pravy-1; i++ )
  199.        {
  200.                 /* najdeme minimum */
  201.                 mi = i;
  202.                 for (j = i+1; j < pravy; j++) {
  203.                     if (pole[j] < pole[mi]) {
  204.                         mi = j;
  205.                     }
  206.                 }
  207.                 /* vyměníme arr[i] a arr[mi] */
  208.                 tmp = pole[i];
  209.                 pole[i] = pole[mi];
  210.                 pole[mi] = tmp;
  211.       //Pomocny vypis
  212.    //cout<<"Pruchod: "<<size-i<<endl;
  213.       //      PrintArray(arr,size);
  214.    }
  215. }
  216.  
  217.  
  218. // vlakno A bude hledat maximalni prvek pole mezi prvkem 0 a DELKA/2
  219. // vysledek ulozi do globalni promenne MAX1
  220. DWORD WINAPI vlaknoA( LPVOID )
  221. {
  222.    printf( "Startuje vlakno A\n" );
  223.     // Tady přinde funkce
  224.    BubbleSort(FIRST, ARRAY_SIZE/2);
  225.    return 0;
  226. }
  227.  
  228. // vlakno B bude hledat maximalni prvek pole mezi prvkem DELKA/2 a DELKA
  229. // vysledek ulozi do globalni promenne MAX2
  230. DWORD WINAPI vlaknoB( LPVOID )
  231. {
  232.    printf( "Startuje vlakno B\n" );
  233.     // Tady přinde funkce
  234.    BubbleSort(SECOND, ARRAY_SIZE-ARRAY_SIZE/2);
  235.    return 0;
  236. }
  237.  
  238.  
  239. //---------------FUNKCE END -------------------------
  240.  
  241. int _tmain(int argc, _TCHAR* argv[])
  242. {
  243.    srand( ( int ) time( NULL ) );
  244.  
  245. //   int arr[ARRAY_SIZE];
  246.  
  247.    POLE = new int[ARRAY_SIZE];
  248.    FIRST = new int[ARRAY_SIZE/2];
  249.    SECOND = new int[ARRAY_SIZE-ARRAY_SIZE/2];
  250.    int BubbleArr[ARRAY_SIZE];
  251.    int InsertArr[ARRAY_SIZE];
  252.    int SelectArr[ARRAY_SIZE];
  253.    int FirstArr[ARRAY_SIZE/2];
  254.    int SecondArr[ARRAY_SIZE-ARRAY_SIZE/2];
  255.  
  256. cout<<"Puvodni pole\n";
  257.    for(int i = 0; i<ARRAY_SIZE; i++)
  258.    {
  259.       POLE[i]=rand32()%NAHODA;
  260.    }
  261.  
  262. //PrintArray(POLE, ARRAY_SIZE);
  263.  
  264. SplitArray(POLE, FIRST,SECOND, ARRAY_SIZE);
  265.  
  266. //Rozkopirovani puvodního pole pro sorty
  267. CoppyArray(POLE, BubbleArr, ARRAY_SIZE);
  268. CoppyArray(POLE, InsertArr, ARRAY_SIZE);
  269. CoppyArray(POLE, SelectArr, ARRAY_SIZE);
  270. /*
  271. cout<<"Bubble sort\n";
  272. BubbleSort(BubbleArr, ARRAY_SIZE);
  273. PrintArray(BubbleArr, ARRAY_SIZE);
  274.  
  275.  
  276. cout<<"Select sort\n";
  277. SelectionSort(SelectArr, ARRAY_SIZE);
  278. PrintArray(SelectArr, ARRAY_SIZE);
  279.  
  280. cout<<"Insert sort\n";
  281. InsertionSort(InsertArr, ARRAY_SIZE);
  282. PrintArray(InsertArr, ARRAY_SIZE);
  283.  
  284.  
  285. SplitArray(arr, FirstArr,SecondArr, ARRAY_SIZE);
  286. cout<<"Prvni pulka sort\n";
  287. PrintArray(FirstArr, ARRAY_SIZE/2);
  288. cout<<"Druha pulka sort\n";
  289. PrintArray(SecondArr, ARRAY_SIZE-ARRAY_SIZE/2);
  290. */
  291.  
  292. //TADY KONCI MUJ RUKOPIS
  293.  
  294. HANDLE p1, p2;
  295. FILETIME cas_pred, cas_po;
  296.  
  297.    // zaznamenani casu pred zapocetim hledani
  298.    GetSystemTimeAsFileTime ( &cas_pred );
  299.  
  300.    // vytvoreni dvou vlaken
  301.    p1 = CreateThread( 0, 0, vlaknoA, 0, 0, 0 );
  302. //   WaitForSingleObject( p1, INFINITE );
  303.    p2 = CreateThread( 0, 0, vlaknoB, 0, 0, 0 );
  304.  
  305.    // cekani na ukonceni vlaken
  306.    WaitForSingleObject( p1, INFINITE );
  307.    WaitForSingleObject( p2, INFINITE );
  308.  
  309.    // zaznam casu po ukonceni prace obou vlaken
  310.    GetSystemTimeAsFileTime( &cas_po );
  311.  
  312.    //printf( "Nalezene maximum je %d\n", max( MAX1, MAX2));
  313.    cout<<"FIRST SORT\n";
  314.    //PrintArray(FIRST, ARRAY_SIZE/2);
  315.    cout<<"SECOND SORT\n";
  316.    //PrintArray(SECOND,ARRAY_SIZE-ARRAY_SIZE/2);
  317.    printf( "Cas hledani byl %d [ms]\n", kolik_ms( &cas_pred, &cas_po ) );
  318.    
  319.    //JEDNO VLAKNO
  320.    printf( "Trideni pomoci 1 vlakna...\n" );
  321.    GetSystemTimeAsFileTime( &cas_pred );
  322.    
  323.    SplitArray(POLE, FirstArr,SecondArr, ARRAY_SIZE);
  324.  
  325.    BubbleSort(FirstArr,ARRAY_SIZE/2);
  326.    
  327.    BubbleSort(SecondArr,ARRAY_SIZE-ARRAY_SIZE/2);
  328.  
  329.    GetSystemTimeAsFileTime( &cas_po );
  330.    cout<<"\nPrvni pulka\n";
  331.    //PrintArray(FirstArr,ARRAY_SIZE/2);
  332.    cout<<"\nDruha pulka\n";
  333. //   PrintArray(SecondArr,ARRAY_SIZE-ARRAY_SIZE/2);
  334.    printf( "\nCas razeni byl %d [ms]\n", kolik_ms( &cas_pred, &cas_po ) );
  335.  
  336.    cout<<"Spojovani pole\n";
  337.    GetSystemTimeAsFileTime( &cas_pred );
  338.    CombineArray(POLE,FirstArr, SecondArr, ARRAY_SIZE);
  339.    GetSystemTimeAsFileTime( &cas_po );
  340.    printf( "\nCas razeni byl %d [ms]\n", kolik_ms( &cas_pred, &cas_po ) );
  341.    cout<<"Tisk spojeneho pole\n";
  342.  
  343.    PrintArray(POLE, ARRAY_SIZE);
  344.  
  345. system("PAUSE");
  346. return 0;
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement