Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.88 KB | None | 0 0
  1. // sortOMP.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <omp.h>
  6. #include <string>
  7. #include <stdio.h>
  8. #include <ctime>
  9. #include <iostream>
  10.  
  11. int tab_size = 100000;
  12.  
  13. using namespace std;
  14.  
  15.  
  16.  
  17. ////////////////
  18.  
  19. void merge(int *arr, int l, int m, int r)
  20. {
  21.     int i, j, k;
  22.     int n1 = m - l + 1;
  23.     int n2 = r - m;
  24.  
  25.  
  26.     int *L, *R;
  27.     L = (int*)malloc(sizeof(int*)*n1);
  28.     R = (int*)malloc(sizeof(int*)*n2);
  29.  
  30.  
  31.     for (i = 0; i < n1; i++)
  32.         L[i] = arr[l + i];
  33.     for (j = 0; j < n2; j++)
  34.         R[j] = arr[m + 1 + j];
  35.  
  36.     i = 0;
  37.     j = 0;
  38.     k = l;
  39.     while (i < n1 && j < n2)
  40.     {
  41.         if (L[i] <= R[j])
  42.         {
  43.             arr[k] = L[i];
  44.             i++;
  45.         }
  46.         else
  47.         {
  48.             arr[k] = R[j];
  49.             j++;
  50.         }
  51.         k++;
  52.     }
  53.  
  54.  
  55.     while (i < n1)
  56.     {
  57.         arr[k] = L[i];
  58.         i++;
  59.         k++;
  60.     }
  61.  
  62.     while (j < n2)
  63.     {
  64.         arr[k] = R[j];
  65.         j++;
  66.         k++;
  67.     }
  68.     free(R); free(L);
  69. }
  70.  
  71.  
  72. void mergeSort(int *arr, int l, int r)
  73. {
  74.     if (l < r)
  75.     {
  76.         int m = l + (r - l) / 2;
  77.         #pragma omp parallel firstprivate(m, l, r) shared(arr) //num_threads(8)
  78.         {
  79.             #pragma omp sections nowait
  80.             {
  81.                 #pragma omp section
  82.                 {
  83.                     mergeSort(arr, l, m);
  84.                 }
  85.  
  86.                 #pragma omp section
  87.                 {
  88.                     mergeSort(arr, m + 1, r);
  89.                 }
  90.             }
  91.            
  92.            
  93.         }
  94.             merge(arr, l, m, r);
  95.        
  96.     }
  97. }
  98.  
  99.  
  100. void mergeSortSekw(int *arr, int l, int r)
  101. {
  102.     if (l < r)
  103.     {
  104.  
  105.         int m = l + (r - l) / 2;
  106.         mergeSort(arr, l, m);
  107.         mergeSort(arr, m + 1, r);
  108.         merge(arr, l, m, r);
  109.  
  110.     }
  111. }
  112.  
  113. bool isAscending(int *tab, int tab_size)
  114. {
  115.     for (register unsigned int i = 0; i <= tab_size; i++)
  116.     {
  117.         if (tab[i] < tab[i - 1])
  118.             return false;
  119.         else
  120.             return true;
  121.     }
  122.     return true;
  123. }
  124.  
  125. void randomNumbers(int *tab, int tab_size)
  126. {
  127.     srand(time(0));
  128.     register unsigned int n = tab_size;
  129.     while (n--)
  130.     {
  131.         tab[n] = rand();
  132.     }
  133. }
  134.  
  135.  
  136. int main()
  137. {
  138.     int *tab;
  139.     int *t;
  140.     srand(time(NULL));
  141.     tab = (int*)malloc(sizeof(int*)*tab_size);
  142.     t = (int*)malloc(sizeof(int*)*tab_size);
  143.  
  144.     randomNumbers(tab, tab_size);
  145.  
  146.     for (int i = 0; i < tab_size; i++)
  147.     {
  148.         t[i] = tab[i];
  149.     }
  150.     clock_t start = clock();
  151.     mergeSort(tab, 0, tab_size - 1);
  152.     clock_t end = clock();
  153.     double elapsed_time = double(end - start) / CLOCKS_PER_SEC;
  154.     printf("Rownolegle: %lf\n", elapsed_time);
  155.     if (isAscending(tab, tab_size)) printf("Tablica posortowana jest prawidlowo\n");
  156.     else printf("Tablica posortowana jest nieprawidlowo\n");
  157.     clock_t start2 = clock();
  158.     mergeSortSekw(t, 0, tab_size - 1);
  159.     clock_t end2 = clock();
  160.     double elapsed_time2 = double(end2 - start2) / CLOCKS_PER_SEC;
  161.     printf("Sekwencyjnie: %lf\n", elapsed_time2);
  162.     if (isAscending(t, tab_size)) printf("Tablica posortowana jest prawidlowo\n");
  163.     else printf("Tablica posortowana jest nieprawidlowo\n");
  164.     //
  165.     //for (int i = 0; i < tab_size; i++)
  166.     //{
  167.     //  printf("Rownolegle: %d \t\t\t Sekwencyjnie: %d\n", tab[i], t[i]);
  168.     //}
  169.  
  170.  
  171.     free(tab); free(t);
  172.     system("Pause");
  173.     return 0;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement