Advertisement
Stybyk

Olivkovo řešení

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