LINUX.ORG.RU

Сообщения nike3456

 

Распараллелить сортировку Шелла open mp

Форум — Development

Добрый день!! У меня задание, нужно распараллелить сортировку, но у меня прога работает как-то коряво, можете сказать что не так в проге

/*Параллельная сортировка Шелла*/
#include "stdafx.h" 
#include <iostream> 
#include <omp.h> 
#include <ctime>
#include <windows.h> 
using namespace std;
int main()
{
	setlocale(LC_ALL, "rus");
	int m;
	const int n = 199;
	int a[n];
	srand(time(NULL));
	cout << "\nИсходный массив: ";
	for (int i = 0; i < n; i++)
	{
		a[i] = rand()%n;
		//a[i] = n-i;
	}
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << "\n";
	cout << endl;
	cout << "Этапы сортировки массива: \n";
	cout << "\n";
	//алгоритм сортировки Шелла
    int step = n / 2;//инициализируем шаг. 
    while (step > 0)//пока шаг не 0 
	{
	#pragma omp parallel for num_threads(2)  
	for (int i = 0; i < (n - step); i++)
	{
		int j = i;
		//будем идти начиная с i-го элемента 
		while (j >= 0 && a[j] > a[j + step]) 
		{
			Sleep(1);
			#pragma omp critical
			//пока не пришли к началу массива 
			//и пока рассматриваемый элемент больше 
			//чем элемент находящийся на расстоянии шага 
		{ 
					//меняем их местами 
					int temp = a[j];
					a[j] = a[j + step];
					a[j + step] = temp;
					m = omp_get_thread_num(); 
					cout << "Поток " << m << " меняет местами элементы с номерами " << j << " и " << j + step << "\n";
					j--;
				}
		}
  }
			step = step / 2;//уменьшаем шаг 
 }
	cout << "\nОтсортированный массив: ";
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << "\n";
	system("pause");
	return 0;
} 

 

nike3456
()

RSS подписка на новые темы