Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2018, 22:16   #1
Nuc
Пользователь
 
Регистрация: 18.02.2018
Сообщений: 18
По умолчанию Сортировка Шелла

Здравствуйте!!! Помогите, не могу разобраться с заданием: Распараллелить сортировку Шелла
Код:
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <Windows.h>
#include <iostream>
#include <omp.h>
#include "stdafx.h"
//сортировка методом Шелла
void ShellSort(int n, int mass[])
{
    int i, j, step;
    int tmp;
#pragma omp parallel for private(i,j)
    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;
}
Nuc вне форума Ответить с цитированием
Старый 30.08.2018, 18:42   #2
Nuc
Пользователь
 
Регистрация: 18.02.2018
Сообщений: 18
По умолчанию

Может ответите?
Nuc вне форума Ответить с цитированием
Старый 30.08.2018, 18:48   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вам никто не обязан отвечать.

И если вы за 3 дня так и не продвинулись никуда и не сформулировали более конкретные вопросы, то вряд ли это добавляет желание помогать.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.09.2018, 20:54   #4
Nuc
Пользователь
 
Регистрация: 18.02.2018
Сообщений: 18
По умолчанию

Извините, что много времени прошло с момента последней переписки, но сделал сортировку Шелла, но препод мне сказал, что он у меня работает коряво, сбои в потоках, неправильно введет сортировку, еще сказал синхронизацию critical надо
Код:
#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;
}
можете сказать, что не так?
Nuc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка Шелла Misha199615 C++ Builder 0 18.10.2015 21:48
Сортировка Шелла bielov Общие вопросы C/C++ 1 07.03.2013 14:43
Сортировка Шелла и Шейкер-сортировка AleksandrMakarov Паскаль, Turbo Pascal, PascalABC.NET 11 11.03.2012 12:18
Сортировка Шелла adidas Паскаль, Turbo Pascal, PascalABC.NET 0 13.12.2011 15:20
сортировка Шелла pilot76 Помощь студентам 2 17.08.2009 18:05