Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <iomanip>
- #include <thread>
- #include <string>
- #include <omp.h>
- #include <conio.h>
- #include <stdio.h>
- #include <time.h>
- #include <Windows.h>
- #include <thread>
- #include <chrono>
- using namespace std;
- using namespace std::chrono;
- string dFile1 = "ProjektasDuom1.txt";
- string dFile2 = "ProjektasDuom2.txt";
- string dFile3 = "ProjektasDuom3.txt";
- string dFile4 = "ProjektasDuom4.txt";
- string dFile5 = "ProjektasDuom5.txt";
- string rFile = "ProjektasRes.txt";
- /*
- Selection sort lygiagretus metodas
- @param a - rikiuojamas skaičių masyvas
- @param amount - masyvo dydis
- @param n - giju skaicius
- */
- int* SelectionSortParallel(int a[], int amount, int n);
- /*
- Dvieju elementu sukeitimo vietomis metodas
- @param a - pirmas skaičius
- @param b - antras skaičius
- */
- void Swap(int *a, int *b);
- /*
- Burbulo rikiavimo metodas, kuris baigia rikiuoti masyva
- @param arr - skaiciu masyvas
- @param n - masyvo dydis
- */
- void BubbleSort(int arr[], int n);
- /*
- Duomenų skaitymo metodas
- @param arr - skaiciu masyvas
- @param amount - masyvo dydis
- @param dataFile - duomenų failas
- */
- void ReadData(int arr[], int amount,string dataFile);
- /*
- Duomenų spausdinimo metodas
- @param arr - skaiciu masyvas
- @param amount - masyvo dydis
- @param resFile - rezultatų failas
- */
- void WriteData(int arr[], int amount, string resFile);
- /*
- Rezultatų spausdinimo metodas
- @param arr - skaiciu masyvas
- @param amount - masyvo dydis
- @param resFile - rezultatų failas
- */
- void WriteRes(int arr[], int amount, string resFile);
- int main()
- {
- int amount1 = 10;
- int amount2 = 100;
- int amount3 = 1000;
- int amount4 = 10000;
- int amount5 = 20000;
- int* res = new int[amount5];
- int* a = new int[amount5];
- for (int i = 1; i < 9; i++) {
- ReadData(a, amount5, dFile5);
- WriteData(a, amount5, rFile);
- auto start = high_resolution_clock::now();
- res = SelectionSortParallel(a, amount5, i);
- auto stop = high_resolution_clock::now();
- auto trukme = duration_cast<microseconds>(stop - start);
- printf("Duomenu kiekis : %d Giju skaicius : %d ",amount5,i);
- printf("Trukme milisekundemis : %d\n", trukme);
- WriteRes(res, amount5, rFile);
- }
- return 0;
- }
- //duomenų skaitymo funkcija
- void ReadData(int arr[], int amount, string dataFile)
- {
- ifstream F(dataFile);
- for (int i = 0; i < amount; i++)
- F >> arr[i];
- F.close();
- }
- //duomenų išvedimo funkcija
- void WriteData(int arr[], int amount, string resFile)
- {
- ofstream R(resFile);
- R << "Duomenys" << endl;
- R << string(15, '-') << endl;
- R << setw(4) << left << "Nr." << setw(5) << left << "Skaicius" << endl;
- for (int i = 0; i < amount; i++)
- R << setw(4) << left << to_string(i + 1) + ")" << setw(5) << left << arr[i] << endl;
- R << string(15, '-') << endl;
- R.close();
- }
- //rezultatų išvedimo funkcija
- void WriteRes(int arr[], int amount, string resFile)
- {
- ofstream R(resFile, ios::app);
- R << setw(10) << left << "Rezultatai" << endl;
- for (int i = 0; i < amount; i++) {
- R << setw(6) << left << to_string(i + 1) + ")" << setw(5) << left << arr[i] << endl;
- }
- R << string(15, '-') << endl;
- R.close();
- }
- //lygiagretus selection sort rikiavimo algoritmo metodas
- int* SelectionSortParallel(int a[], int amount, int n)
- {
- int i, j;
- int tnr, min;
- bool canSwap = false;
- #pragma omp parallel num_threads(n) private(i,j,tnr)
- {
- tnr = omp_get_thread_num();
- for (i = 0; i < amount - 1; i++) {
- min = i;
- canSwap = true;
- //naudojamas užtikrinti sinchronizacijai - visos gijos turi įvykdyti šitą kodo dalį, kad būtu einama toliau
- #pragma omp barrier
- #pragma omp for
- for (j = i + 1; j < amount; j++)
- {
- //printf("Dabar dirba %d-ia gija\n", me);
- if (a[j] < a[min]) {
- min = j;
- //printf("I am %d processing %d,%d\n", me, i, j);
- }
- }
- //naudojamas, kad tik viena gija tuo pačiu metu galėtų keisti elementus vietom
- #pragma omp critical(swap)
- if (canSwap)
- {
- Swap(&a[min], &a[i]);
- canSwap = false;
- //printf("%d, ", arr[i]);
- }
- #pragma omp barrier
- }
- }
- BubbleSort(a, amount);
- return a;
- }
- //duomenų sukeitimo funkcija
- void Swap(int *a, int *b)
- {
- int temp = *a;
- *a = *b;
- *b = temp;
- }
- //bubble sort rikiavimo algoritmas, kuris pabaigia rikiuoti duomenis
- void BubbleSort(int arr[], int n)
- {
- int i, j;
- for (i = 0; i < n - 1; i++)
- for (j = 0; j < n - i - 1; j++)
- if (arr[j] > arr[j + 1])
- Swap(&arr[j], &arr[j + 1]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement