Russian Qt Forum
Ноябрь 23, 2024, 02:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сортировка слиянием.  (Прочитано 7734 раз)
Марина
Гость
« : Апрель 29, 2014, 16:20 »

Есть программа на с++ сортировка методом слияния. Нужно сделать эту сортировку многопоточной. Не получается. Может кто подскажет чего?
#include "stdafx.h"
#include <iostream>
using namespace std;
//функция, сливающая массивы
void Merge(int *A, int first, int last)
{
int middle, start, final, j;
int *mas=new int[100];
middle=(first+last)/2; //вычисление среднего элемента
start=first; //начало левой части
final=middle+1; //начало правой части
for(j=first; j<=last; j++) //выполнять от начала до конца
if ((start<=middle) && ((final>last) || (A[start]<A[final])))
{
mas[j]=A[start];
start++;
}
else
{
mas[j]=A[final];
final++;
}
//возвращение результата в список
for (j=first; j<=last; j++) A[j]=mas[j];
delete[]mas;
};
//рекурсивная процедура сортировки
void MergeSort(int *A, int first, int last)
{
{
if (first<last)
{
MergeSort(A, first, (first+last)/2); //сортировка левой части
MergeSort(A, (first+last)/2+1, last); //сортировка правой части
Merge(A, first, last); //слияние двух частей
}
}
};
//главная функция
void main()
{
setlocale(LC_ALL, "Rus");
int i, n;
int *A=new int[100];
cout<<"Размер массива > "; cin>>n;
for (i=1; i<=n; i++)
{ cout<<i<<" элемент > "; cin>>A;}
MergeSort(A, 1, n); //вызов сортирующей процедуры
cout<<"Упорядоченный массив: "; //вывод упорядоченного массива
for (i=1; i<=n; i++) cout<<A<<" ";
delete []A;
system("pause>>void");
}


на Qt  работает.
Записан
OKTA
Гость
« Ответ #1 : Апрель 29, 2014, 16:29 »

Ознакомьтесь и используйте - QtConcurrentRun
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Апрель 29, 2014, 23:37 »

Нужно сделать эту сортировку многопоточной. Не получается.
А вы и не пытались Улыбающийся для многопоточности используется QThread или QtConcurrentRun Подмигивающий

на Qt  работает.
Конечно работает, Ведь Qt - библиотека с++ Улыбающийся

И для оформления кода используйте тэг code (кнопка с решеткой # или выбор в выпадающем списке языков) Улыбающийся
« Последнее редактирование: Апрель 29, 2014, 23:41 от gil9red » Записан

Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 30, 2014, 10:23 »

Марина, пользуйтесь тегом для оформления кода

Ознакомьтесь и используйте - QtConcurrentRun

А вы и не пытались Улыбающийся для многопоточности используется QThread или QtConcurrentRun Подмигивающий
Резво Улыбающийся Но вот на что Вы будете натравливать QtConcurrentRun? Ведь вначале у Вас всего одна задача. Только после того как раскидаете массив на 2 части - 2 задачи и.т.д. А ядер напр 8. И что будете делать?  Улыбающийся
Записан
OKTA
Гость
« Ответ #4 : Апрель 30, 2014, 10:39 »

Это уже дело TC.
А какая разница сколько ядер? В 32-разрядной винде к примеру нельзя создать внутри одного процесса больше 2048 потоков, сколько бы процессоров и ядер не было. А на каких ядрах эти потоки будут работать - целиком дело системы. Если конечно не пытаться это изменить самому.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 30, 2014, 10:54 »

Это уже дело TC.
А какая разница сколько ядер? В 32-разрядной винде ...
В другую сторону смотрите - что/как распараллелить. Это в данном случае не так уж просто. Я делал через omp intel task но это решение не общее. Вопрос хороший/интересный (неважно подозревал ли об этом ТС  Улыбающийся)
Записан
OKTA
Гость
« Ответ #6 : Апрель 30, 2014, 11:03 »

Это я понимаю, но думаю совет использовать omp принесет мало пользы TC, а с QTConcurrentRun можно хоть что-то попробовать сделать самостоятельно. С рекурсивной функцией конечно будет тяжко, но зато хоть думалка заработает  Смеющийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 30, 2014, 11:38 »

Это я понимаю, но думаю совет использовать omp принесет мало пользы TC, а с QTConcurrentRun можно хоть что-то попробовать сделать самостоятельно. С рекурсивной функцией конечно будет тяжко, но зато хоть думалка заработает  Смеющийся
Думается это не тот случай когда можно снисходительно давать советы Улыбающийся У самих-то советчиков думалки работают? Вот я лично в упор не вижу как задействовать Concurrent, на QThread сделать можно, но получится как-то длинно. Возможно std::thread, но там тяжело будет с оптимальностью. Хотя вряд ли она нужна ТС - но все же.
Записан
OKTA
Гость
« Ответ #8 : Апрель 30, 2014, 14:35 »

Распараллелить сортировку подмассивов уже даст выигрыш в скорости. Останется вопрос в распареллеливании ф-ии слияния массивов, но в данной реализации она не особо и поддастся, а смотреть другие способы слияния - уже другой вопрос и опять же к ТС.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Апрель 30, 2014, 19:05 »

Это я понимаю, но думаю совет использовать omp принесет мало пользы TC, а с QTConcurrentRun можно хоть что-то попробовать сделать самостоятельно. С рекурсивной функцией конечно будет тяжко, но зато хоть думалка заработает  Смеющийся
Думается это не тот случай когда можно снисходительно давать советы Улыбающийся У самих-то советчиков думалки работают? Вот я лично в упор не вижу как задействовать Concurrent, на QThread сделать можно, но получится как-то длинно. Возможно std::thread, но там тяжело будет с оптимальностью. Хотя вряд ли она нужна ТС - но все же.

Не знаю, не разбирался Улыбающийся спросили на Qt-шном форуме про потоки, вот я и подсказал инструмент Улыбающийся
Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Май 02, 2014, 13:04 »

на QThread сделать можно, но получится как-то длинно. Возможно std::thread, но там тяжело будет с оптимальностью.
Улыбнуло. А что, по вашему, не так с оптимальностью std::thread? Да ещё и по сравнению с QThread? Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.148 секунд. Запросов: 23.