Advertisement
Gronos02

Untitled

May 22nd, 2022
1,035
142 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma clang diagnostic push
  2. #pragma ide diagnostic ignored "openmp-use-default-none"
  3. #include <iostream>
  4. #include <omp.h>
  5.  
  6. using namespace std;
  7.  
  8. #define SIZE 40
  9.  
  10. void bubbleSort(int arr[], int n)
  11. {
  12.     int i, j;
  13.     //omp_set_num_threads(2);
  14.     #pragma omp for schedule(static)
  15.     for (i = 0; i < n - 1; i++)
  16.  
  17.         // Last i elements are already in place
  18.         for (j = 0; j < n - i - 1; j++)
  19.  
  20.             if (arr[j] > arr[j + 1])
  21.                 swap(arr[j], arr[j + 1]);
  22. }
  23.  
  24. void insertionSort(int arr[], int n)
  25. {
  26.     int i, key, j;
  27.     #pragma omp for schedule(static)
  28.     for (i = 1; i < n; i++)
  29.     {
  30.         key = arr[i];
  31.         j = i - 1;
  32.  
  33.         // Move elements of arr[0..i-1],
  34.         // that are greater than key, to one
  35.         // position ahead of their
  36.         // current position
  37.         while (j >= 0 && arr[j] > key)
  38.         {
  39.             arr[j + 1] = arr[j];
  40.             j = j - 1;
  41.         }
  42.         arr[j + 1] = key;
  43.     }
  44. }
  45.  
  46. /*void merge(int arr[])
  47. {
  48.     //SORT 1 AND 2
  49.     int* arr_copy = new int [SIZE];
  50.     std::copy_n(arr, SIZE, arr_copy);
  51.  
  52.     int f = 0;
  53.     int s = SIZE / 4;
  54.     int i = 0;
  55.  
  56.     while ((s <= SIZE / 2) || (f <= SIZE / 2))
  57.     {
  58.         if(arr_copy[f] > arr_copy[s])
  59.         {
  60.             arr[i] = arr_copy[s];
  61.             s++;
  62.         }
  63.         else
  64.         {
  65.             arr[i] = arr_copy[f];
  66.             f++;
  67.         }
  68.         i++;
  69.     }
  70.  
  71.     for (int j = 0; j < SIZE; j++)
  72.         cout << arr[j] << " ";
  73.     cout << endl;
  74.  
  75.     f = SIZE / 2;
  76.     s = (SIZE / 4) * 3;
  77.  
  78.     while ((s <= SIZE) || (f <= SIZE))
  79.     {
  80.         if(arr_copy[f] > arr_copy[s])
  81.         {
  82.             arr[i] = arr_copy[s];
  83.             s++;
  84.         }
  85.         else
  86.         {
  87.             arr[i] = arr_copy[f];
  88.             f++;
  89.         }
  90.         i++;
  91.     }
  92. }*/
  93.  
  94. void Merge(int arr[], int beg, int end, int mid)
  95. {
  96.     int i, j, k;
  97.     int* temp = new int [SIZE];
  98.     std::copy_n(arr, SIZE, temp);
  99.     i = beg;
  100.     k = 0;
  101.     j = mid + 1;
  102.  
  103.     while (i <= mid && j <= end)
  104.     {
  105.         if (arr[i] < arr[j])
  106.         {
  107.             temp[k] = arr[i];
  108.             k++;
  109.             i++;
  110.         }
  111.         else
  112.         {
  113.             temp[k] = arr[j];
  114.             k++;
  115.             j++;
  116.         }
  117.     }
  118.  
  119.     // Вставить все оставшиеся значения от i до mid temp[]
  120.     while (i <= mid)
  121.     {
  122.         temp[k] = arr[i];
  123.         k++;
  124.         i++;
  125.     }
  126.  
  127.     // Вставить все оставшиеся значения от j до end temp[]
  128.     while (j <= end)
  129.     {
  130.         temp[k] = arr[j];
  131.         k++;
  132.         j++;
  133.     }
  134.  
  135.     // Присвоить отсортированные данные в temp[] для arr[]
  136.     for (i = beg; i <= end; i++)
  137.     {
  138.         arr[i] = temp[i - beg];
  139.     }
  140. }
  141.  
  142. int main()
  143. {
  144.     omp_set_nested(1);
  145.  
  146.     int* arr = new int [SIZE];
  147.  
  148.     //arr_10 = new int* [SIZE];
  149.     srand(time(NULL));
  150.     for (int i = 0; i < SIZE; i++)
  151.     {
  152.         arr[i] = rand() % 10;
  153.         //arr_10[i] = new int[SIZE];
  154.     }
  155.  
  156.     for (int i = 0; i < SIZE; i++)
  157.     {
  158.         cout << arr[i] << " ";
  159.     }
  160.     cout << endl;
  161.  
  162.     #pragma omp parallel num_threads(4)
  163.     {
  164.         //bubbleSort(arr, SIZE);
  165.         insertionSort(arr, SIZE);
  166.     }
  167.     Merge(arr, 0, SIZE, SIZE / 2);
  168.     /*Merge(arr, 0, SIZE / 2, SIZE / 4);
  169.     Merge(arr, SIZE / 2, SIZE, (SIZE / 4) * 3);
  170.     Merge(arr, 0, SIZE, SIZE / 2);*/
  171.  
  172.     for (int i = 0; i < SIZE; i++)
  173.     {
  174.         cout << arr[i] << " ";
  175.     }
  176. }
Advertisement
RAW Paste Data Copied
Advertisement