С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 19.04.2023
Сообщений: 3

Многопоточная сортировка слиянием (mergesort)

19.04.2023, 14:11. Показов 1134. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте. Реализовал сортировку слиянием для Object[]. По условию задания нужно добавить многопоток, добавил потоки, но оно не сортирует корректно. Однопоточная версия при этом работает великолепно. Что я сделал не так? помогите пожалуйста.
Java
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
public class ThreadSort {
    int TN=0;
    int threadNum = 0;
    SortThread[] threads;
    public class SortThread extends Thread{
        Object []array;
        public SortThread(Object[]a){
            array=new Object[a.length];
            System.arraycopy(a, 0, array, 0, a.length);
        }
        @Override
        public void run(){
 
            MergeSort(array);
        }
    }
    public  ThreadSort(int thread){
        this.TN=thread;
        threads = new SortThread[thread];
    }
 
        public void MergeSort(Object[] a) {
 
 
            int n = a.length;
            if (n < 2) {
                return;
            }
            int mid = n / 2;
            Object[] l = new Object[mid];
            Object[] r = new Object[n - mid];
 
            for (int i = 0; i < mid; i++) {
                l[i] = a[i];
            }
            for (int i = mid; i < n; i++) {
                r[i - mid] = a[i];
            }
            if(this.threadNum > this.TN){
                this.threadNum = this.threadNum - this.TN;
            }
            int t1 = this.threadNum;
 
 
 
 
            threads[t1] = new SortThread(l);
                    threads[t1].start();
            this.threadNum++;
            if(this.threadNum >= this.TN){
                this.threadNum = this.threadNum - this.TN;
            }
            int t2 = this.threadNum;
            threads[t2] = new SortThread(r);
                threads[t2].start();
            for(int i = 0; i < threads.length; ++i) {
                if(threads[i] != null) {
                    try {
                        threads[t1].join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    try {
                        threads[t2].join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
 
 
            merge(a, l, r, l.length, r.length);
 
        }
        public static void merge(Object[] a, Object[] l, Object[] r, int left, int right) {
            synchronized (a) {
                synchronized (l) {
                    synchronized (r) {
                        int i = 0, j = 0, k = 0;
                        while (i < left && j < right) {
                            if ((((Comparable) l[i]).compareTo(r[j])) >= 0) {
                                a[k++] = l[i++];
                            } else {
                                a[k++] = r[j++];
                            }
                        }
                    }
                }
            }
        }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.04.2023, 14:11
Ответы с готовыми решениями:

Многопоточная сортировка массива
Добрый день, подскажите пожалуйста: как можно, используя threads отсортировать два массива, а потом объеденить все это должно быть с...

Сортировка слиянием
Здравствуйте, помогите, пожалуйста. Суть в том, что массивы разбиваются до одного элемента и сливаются в массив из двух правильно, по...

Сортировка слиянием
Подскажите пожалуйста как можно частично реализовать сортировку слиянием в Java , такой момент есть несколько отсортированных файлов их...

4
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
19.04.2023, 15:11
Цитата Сообщение от lexa_barbaris Посмотреть сообщение
synchronized (a) {
                synchronized (l) {
                    synchronized (r) {
Читал что-то о dynamic lock-ordering deadlock?
0
0 / 0 / 0
Регистрация: 19.04.2023
Сообщений: 3
19.04.2023, 15:14  [ТС]
Добавлено через 58 секунд
Нет, примерно представляю о чём это, но проблема не в этом. Стереть эти строчки и ничего не изменится, тут прикол в чём-то другом, вот не могу понять в чём
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
19.04.2023, 17:54
Кое как потестил, вроде работает. Через рекурсию мне не нравится делать алгоритмы. Но для этого есть ForkJoinPool, минимум переделок понадобится от классического алгоритма.
Java
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import java.lang.reflect.Array;
import java.util.AbstractMap;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
 
public class Main {
    public static void main(String[] args) {
        Integer[] arr = {5, 3, 5, 67, 2};
        NedoSort.parallelMergeSort(arr, Integer::compareTo);
        System.out.println(Arrays.toString(arr));
    }
}
 
class NedoSort {
    public static <T> void parallelMergeSort(T[] array, Comparator<? super T> comparator) {
        if (array.length < 2) return;
        final var queueTask = new LinkedBlockingQueue<Map.Entry<T[], T[]>>(Math.max(2, array.length / 2));
        final var queueResult = new LinkedBlockingQueue<T[]>(Math.max(2, array.length / 2));
        final int NT = Runtime.getRuntime().availableProcessors();
        final var threadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        try {
            for (int i = 0; i < NT; ++i) threadPool.execute(new Merger<>(queueTask, queueResult, comparator));
            T[]
                    t1 = (T[]) Array.newInstance(array.getClass().getComponentType(), 2),
                    t2 = (T[]) Array.newInstance(array.getClass().getComponentType(), 2);
            int q = 0;
            for (T t : array) {
                if (q < 2) {
                    t1[q++] = t;
                } else {
                    t2[q++ - 2] = t;
                }
                if (q == 4) {
                    q = 0;
                    if (comparator.compare(t1[0], t1[1]) > 0) swap(t1, 0, 1);
                    if (comparator.compare(t2[0], t2[1]) > 0) swap(t2, 0, 1);
                    queueTask.put(new AbstractMap.SimpleEntry<>(Arrays.copyOf(t1, 2), Arrays.copyOf(t2, 2)));
                }
            }
            if (q > 0) {
                if (q > 1 && comparator.compare(t1[0], t1[1]) > 0) swap(t1, 0, 1);
                queueResult.put(Arrays.copyOf(t1, Math.min(q, 2)));
            }
            if (q > 2) {
                if (q > 3 && comparator.compare(t2[0], t2[1]) > 0) swap(t2, 0, 1);
                queueResult.put(Arrays.copyOf(t2, q - 2));
            }
            T[] t;
            while ((t = queueResult.take()).length < array.length) {
                queueTask.put(new AbstractMap.SimpleEntry<>(t, queueResult.take()));
            }
            System.arraycopy(t, 0, array, 0, array.length);
 
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            threadPool.shutdownNow();
        }
    }
 
    private static <T> T[] merge(T[] t1Arr, T[] t2Arr, Comparator<? super T> comparator) {
        T[] result = (T[]) Array.newInstance(t1Arr.getClass().getComponentType(), t1Arr.length + t2Arr.length);
        int qt1 = 0, qt2 = 0, qr = 0;
        while (qt1 < t1Arr.length && qt2 < t2Arr.length) {
            if (comparator.compare(t1Arr[qt1], t2Arr[qt2]) < 0) {
                result[qr] = t1Arr[qt1++];
            } else {
                result[qr] = t2Arr[qt2++];
            }
            qr++;
        }
        if (t2Arr.length - qt2 > 0) System.arraycopy(t2Arr, qt2, result, qr, t2Arr.length - qt2);
        if (t1Arr.length - qt1 > 0) System.arraycopy(t1Arr, qt1, result, qr, t1Arr.length - qt1);
        return result;
    }
 
    /**
     * Swaps x[a] with x[b].
     */
    private static void swap(Object[] x, int a, int b) {
        Object t = x[a];
        x[a] = x[b];
        x[b] = t;
    }
 
    private record Merger<T>(BlockingQueue<? extends Map.Entry<T[], T[]>> queueTask,
                             BlockingQueue<? super T[]> queueResult,
                             Comparator<? super T> comparator) implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    var entry = queueTask.take();
                    queueResult.put(merge(entry.getValue(), entry.getKey(), comparator));
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 19.04.2023
Сообщений: 3
19.04.2023, 21:57  [ТС]
спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2023, 21:57
Помогаю со студенческими работами здесь

Сортировка Слиянием по Кормену
Помогите найти ошибки в коде import java.util.Arrays; public class MergeSortAlg { public static void...

Сортировка слиянием Java
Задание: Осуществить нисходящую сортировку слиянием, по возрастанию пропущенных занятий, и вывести полученный массив на экран Код: ...

Сортировка слиянием на RMI
подскажите, помогите реализовать сортировку слиянием на 2+ машинах, как это на одной машине с потоками знаю как сделать, а вот на RMI

Сортировка Естественным Слиянием (SortMerge)
Доброго времени суток! Столкнулся с такой проблемой, написал простенькую сортировку слиянием. И в принципе она работает, но не на всех...

Сортировка естественным слиянием (Natural Merge)
Не могу найти сортировку Естественным слиянием (код). Есть у кого-нибудь??


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru