Название: Сортировка слиянием. Отправлено: Марина от Апрель 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 работает. Название: Re: Сортировка слиянием. Отправлено: OKTA от Апрель 29, 2014, 16:29 Ознакомьтесь и используйте - QtConcurrentRun
Название: Re: Сортировка слиянием. Отправлено: gil9red от Апрель 29, 2014, 23:37 Нужно сделать эту сортировку многопоточной. Не получается. А вы и не пытались :) для многопоточности используется QThread (http://qt-project.org/doc/qt-4.8/qthread.html#details) или QtConcurrentRun (http://qt-project.org/doc/qt-4.8/qtconcurrentrun.html) ;)на Qt работает. Конечно работает, Ведь Qt - библиотека с++ :)И для оформления кода используйте тэг code (кнопка с решеткой # или выбор в выпадающем списке языков) :) Название: Re: Сортировка слиянием. Отправлено: Igors от Апрель 30, 2014, 10:23 Марина, пользуйтесь тегом для оформления кода
Ознакомьтесь и используйте - QtConcurrentRun А вы и не пытались :) для многопоточности используется QThread (http://qt-project.org/doc/qt-4.8/qthread.html#details) или QtConcurrentRun (http://qt-project.org/doc/qt-4.8/qtconcurrentrun.html) ;) Резво :) Но вот на что Вы будете натравливать QtConcurrentRun? Ведь вначале у Вас всего одна задача. Только после того как раскидаете массив на 2 части - 2 задачи и.т.д. А ядер напр 8. И что будете делать? :)Название: Re: Сортировка слиянием. Отправлено: OKTA от Апрель 30, 2014, 10:39 Это уже дело TC.
А какая разница сколько ядер? В 32-разрядной винде к примеру нельзя создать внутри одного процесса больше 2048 потоков, сколько бы процессоров и ядер не было. А на каких ядрах эти потоки будут работать - целиком дело системы. Если конечно не пытаться это изменить самому. Название: Re: Сортировка слиянием. Отправлено: Igors от Апрель 30, 2014, 10:54 Это уже дело TC. В другую сторону смотрите - что/как распараллелить. Это в данном случае не так уж просто. Я делал через omp intel task но это решение не общее. Вопрос хороший/интересный (неважно подозревал ли об этом ТС :))А какая разница сколько ядер? В 32-разрядной винде ... Название: Re: Сортировка слиянием. Отправлено: OKTA от Апрель 30, 2014, 11:03 Это я понимаю, но думаю совет использовать omp принесет мало пользы TC, а с QTConcurrentRun можно хоть что-то попробовать сделать самостоятельно. С рекурсивной функцией конечно будет тяжко, но зато хоть думалка заработает ;D
Название: Re: Сортировка слиянием. Отправлено: Igors от Апрель 30, 2014, 11:38 Это я понимаю, но думаю совет использовать omp принесет мало пользы TC, а с QTConcurrentRun можно хоть что-то попробовать сделать самостоятельно. С рекурсивной функцией конечно будет тяжко, но зато хоть думалка заработает ;D Думается это не тот случай когда можно снисходительно давать советы :) У самих-то советчиков думалки работают? Вот я лично в упор не вижу как задействовать Concurrent, на QThread сделать можно, но получится как-то длинно. Возможно std::thread, но там тяжело будет с оптимальностью. Хотя вряд ли она нужна ТС - но все же. Название: Re: Сортировка слиянием. Отправлено: OKTA от Апрель 30, 2014, 14:35 Распараллелить сортировку подмассивов уже даст выигрыш в скорости. Останется вопрос в распареллеливании ф-ии слияния массивов, но в данной реализации она не особо и поддастся, а смотреть другие способы слияния - уже другой вопрос и опять же к ТС.
Название: Re: Сортировка слиянием. Отправлено: gil9red от Апрель 30, 2014, 19:05 Это я понимаю, но думаю совет использовать omp принесет мало пользы TC, а с QTConcurrentRun можно хоть что-то попробовать сделать самостоятельно. С рекурсивной функцией конечно будет тяжко, но зато хоть думалка заработает ;D Думается это не тот случай когда можно снисходительно давать советы :) У самих-то советчиков думалки работают? Вот я лично в упор не вижу как задействовать Concurrent, на QThread сделать можно, но получится как-то длинно. Возможно std::thread, но там тяжело будет с оптимальностью. Хотя вряд ли она нужна ТС - но все же. Не знаю, не разбирался :) спросили на Qt-шном форуме про потоки, вот я и подсказал инструмент :) Название: Re: Сортировка слиянием. Отправлено: Old от Май 02, 2014, 13:04 на QThread сделать можно, но получится как-то длинно. Возможно std::thread, но там тяжело будет с оптимальностью. Улыбнуло. А что, по вашему, не так с оптимальностью std::thread? Да ещё и по сравнению с QThread? :) |