Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка Шелла / 12 сообщений из 12, страница 1 из 1
11.07.2018, 19:07
    #39672722
Gomn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
Здравствуйте!!! Помогите пожалуйста с заданием: Распараллелить сортировку Шелла
Тут последовательный алгоритм Шелла, а мне надо параллельный
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <Windows.h>
#include <iostream>
 
//сортировка методом Шелла
void ShellSort(int n, int mass[])
{
    int i, j, step;
    int tmp;
    for (step = n / 2; step > 0; step /= 2)
        for (i = step; i < n; i++)
        {
            tmp = mass[i];
            for (j = i; j >= step; j -= step)
            {
                if (tmp < mass[j - step])
                    mass[j] = mass[j - step];
                else
                    break;
            }
            mass[j] = tmp;
        }
}
 
int main()
{
    //ввод N
    int N;
    printf("Input N: ");
    scanf_s("%d", &N);
    //выделение памяти под массив
    int* mass;
    mass = (int *)malloc(N * sizeof(int));
    //ввод элементов массива
    printf("Input the array elements:\n");
    for (int i = 0; i < N; i++)
        scanf_s("%d", &mass[i]);
    //сортировка методом Шелла
    ShellSort(N, mass);
    //вывод отсортированного массива на экран
    printf("Sorted array:\n");
    for (int i = 0; i < N; i++)
        printf("%d ", mass[i]);
    printf("\n");
    //освобождение памяти
    free(mass);
    _getch();
    return 0;
}
...
Рейтинг: 0 / 0
11.07.2018, 20:10
    #39672743
OoCc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
Gomn,

Разбей массив на массивчики, отсортируй их в нитях и соедини результат.
И не вводи весь массив с клавиатуры. Сгенери случайным образом.
...
Рейтинг: 0 / 0
11.07.2018, 23:57
    #39672793
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
OoCcGomn,

Разбей массив на массивчики, отсортируй их в нитях и соедини результат.
И не вводи весь массив с клавиатуры. Сгенери случайным образом.
Скорее всего препод не это имел в виду. Если мы сделаем так - то втаскиеваем
лабораторную работу еще один (другой) алогоритм сортировки типа слияния.
Это выглядит странно.

С другой стороны Шелл не приспособлен для параллелизма. И тут нужно 10 раз
подумать как делать обмен ячеек в памяти в условиях когда эта-же память
читается и пишется другими процессами.

Вообще задача пахнет "недопонятой" или "недосказанной" постановкой.
...
Рейтинг: 0 / 0
13.07.2018, 13:06
    #39673681
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
Gomn,

ну а гугл что говорит? тынц
...
Рейтинг: 0 / 0
13.07.2018, 23:08
    #39673916
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
kealon(Ruslan)Gomn,

ну а гугл что говорит? тынц
Готов спорить что эта статья автору не поможет. Ему надо по уровню легче.
...
Рейтинг: 0 / 0
14.07.2018, 00:06
    #39673919
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
mayton,

я даже спорить не буду
...
Рейтинг: 0 / 0
18.09.2018, 18:47
    #39704494
Gomn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
/*Параллельная сортировка Шелла*/
#include "stdafx.h" 
#include <iostream> 
#include <Windows.h> 
#include <conio.h> 
#include <omp.h> 
#include <time.h> 
#include <ctime>
using namespace std;
int main()
{
	setlocale(LC_ALL, "rus");
	int m, y = 0;
	const int n = 5;
	int a[n];
	srand(time(NULL));
	cout << "\nИсходный массив: ";
	for (int i = 0; i < n; i++)
	{
		a[i] = rand()%n;
	}
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << "\n";
	cout << endl;
	cout << "Этапы сортировки массива: \n";
	cout << "\n";
	//алгоритм сортировки Шелла
#pragma omp parallel firstprivate(n)
	{
		m = omp_get_thread_num();
		int step = n / 2;//инициализируем шаг. 
		while (step > 0)//пока шаг не 0 
		{
#pragma omp for 
			for (int i = 0; i < (n - step); i++)
			{
				int j = i;
				//будем идти начиная с i-го элемента 
				while (j >= 0 && a[j] > a[j + step])
					//пока не пришли к началу массива 
					//и пока рассматриваемый элемент больше 
					//чем элемент находящийся на расстоянии шага 
				{
					//меняем их местами 
					int temp = a[j];
					a[j] = a[j + step];
					a[j + step] = temp;
					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;
}


Но препод сказал, он у тебя коряво работает, нет синхронизации, сбои в потоке, помогите правильно сделать
...
Рейтинг: 0 / 0
18.09.2018, 23:21
    #39704627
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
1) У тебя первый вариант работает? Если да - то используй его как эталон.
2) Запусти второй вариант. На одних и тех-же данных (seed(0)+rand должны дать одинаковую последовательсность чисел)
у тебя оба варианта должны дать 100% совпадание сортированных чисел в обоих вариантах.

3) Надо было больше информации вытрясти из препода. Что значит "коряво"? Где нужна синхронизация? И как препод догадался
что "сбои в потоке" ?
...
Рейтинг: 0 / 0
19.09.2018, 08:26
    #39704673
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
Gomn,

Сделай засечку времени на приличного размере массиве и сравни, поможет тебе такое "распараллеливание" или нет.
Препод прав.
...
Рейтинг: 0 / 0
19.09.2018, 08:27
    #39704674
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
Ах да. Результат работы надо проверять.
Если из разных потоков пишешь в одну переменную, получается чушь.
...
Рейтинг: 0 / 0
19.09.2018, 08:53
    #39704689
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
maytonkealon(Ruslan)Gomn,

ну а гугл что говорит? тынц
Готов спорить что эта статья автору не поможет. Ему надо по уровню легче.
Очень забавная статья
автор... На первом этапе ( N итераций) осуществляется взаимодействие процессоров, являющихся соседними в структуре гиперкуба ...
Как они "взаимодействие процессоров" в коде представляют? Можно было попроще объяснить.
...
Рейтинг: 0 / 0
03.10.2018, 00:05
    #39712151
Gomn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка Шелла
SiemarglGomn,

Сделай засечку времени на приличного размере массиве и сравни, поможет тебе такое "распараллеливание" или нет.
Добавил pragma critical, вроде потоки не сбиваются и сортирует как надо
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
/*Параллельная сортировка Шелла*/
#include "stdafx.h" 
#include <iostream> 
#include <Windows.h> 
#include <conio.h> 
#include <omp.h> 
#include <time.h> 
#include <ctime>
using namespace std;
int main()
{
	setlocale(LC_ALL, "rus");
	double start_time, end_time;
	int m, y = 0;
	const int n = 120;
	int a[n];
	srand(time(NULL));
	cout << "\nИсходный массив: ";
	for (int i = 0; i < n; i++)
	{
		a[i] = rand()%n;
	}
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << "\n";
	cout << endl;
	cout << "Этапы сортировки массива: \n";
	cout << "\n";
	//алгоритм сортировки Шелла
	start_time = omp_get_wtime();
#pragma omp parallel firstprivate(n)
	{
		m = omp_get_thread_num();
		int step = n / 2;//инициализируем шаг. 
		while (step > 0)//пока шаг не 0 
		{
			#pragma omp parallel for
			for (int i = 0; i < (n - step); i++)
				#pragma omp critical 
			{
				int j = i;
				//будем идти начиная с i-го элемента 
				while (j >= 0 && a[j] > a[j + step])
					//пока не пришли к началу массива 
					//и пока рассматриваемый элемент больше 
					//чем элемент находящийся на расстоянии шага 
				{
					//меняем их местами 
					int temp = a[j];
					a[j] = a[j + step];
					a[j + step] = temp;
					cout << "Поток " << m << " меняет местами элементы с номерами " << j << " и " << j + step << "\n";
					j--;
				}
			}
			step = step / 2;//уменьшаем шаг 
		}
	}
	end_time = omp_get_wtime();
	cout << "\nОтсортированный массив: ";
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << "\n";
	cout << "Время на замер времени: " << end_time - start_time << endl;
	system("pause");
	return 0;
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка Шелла / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]