Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

Здравствуйте!!! Помогите, не могу разобраться с заданием: Распараллелить сортировку Шелла
Код:

#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, 19:42   #2
Nuc
Пользователь
 
Регистрация: 18.02.2018
Сообщений: 14
Репутация: 10
По умолчанию

Может ответите?
Nuc вне форума   Ответить с цитированием
Старый 30.08.2018, 19:48   #3
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 17,155
Репутация: 3316

icq: 512-765
skype: alexp.frl
По умолчанию

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

И если вы за 3 дня так и не продвинулись никуда и не сформулировали более конкретные вопросы, то вряд ли это добавляет желание помогать.
Alex11223 на форуме   Ответить с цитированием
Старый 30.09.2018, 21:54   #4
Nuc
Пользователь
 
Регистрация: 18.02.2018
Сообщений: 14
Репутация: 10
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


15:19.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru