С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 23

Проблема с сортировкой

28.11.2020, 01:33. Показов 1495. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, у меня возник вопрос. Я не прошу реализации моей проблемы, просто намекните как сделать лучше

Пишу программу и есть задача отсортировать элементы. Элементы - кнопки со значением цифр.

Есть список и нужно его отсортировать в обе стороны ( сначала по убыванию, потом по возрастанию) .
Выбрал quicksort  алгоритм. Решил правильно, сортирует. Но решил коряво, делал две сортировки, которые практически одинаковые и устанавливаю флаг. Когда отсортировал первый раз флаг меняется и при повторном обращении уже будет срабатывать в другом порядке. В глазки бросается. Как тут правильно поступить? Чтобы без дубликатов.


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
 private void quickSortIncreasing(List<JButton> buttonList, int left, int right) {
        if (isNullOrEmpty(buttonList.size())) {
            return;
        }
        if (left >= right) {
            return;
        }
        int middle = left + (right - left) / 2;
        int pivot = getInt(buttonList.get(middle));
        int i = left, j = right;
        while (i <= j) {
            while (getInt(buttonList.get(i)) > pivot) {
                i++;
            }
            while (getInt(buttonList.get(j)) < pivot) {
                j--;
            }
            if (i <= j) {
                JButton temp = buttonList.get(i);
                buttonList.set(i, buttonList.get(j));
                buttonList.set(j, temp);
                i++;
                j--;
                refreshSortPage(buttonList, panel);
            }
        }
        if (left < j) {
            quickSortIncreasing(buttonList, left, j);
        }
        if (right > i) {
            quickSortIncreasing(buttonList, i, right);
        }
    }



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
 private void quickSortDescending(List<JButton> buttonList, int left, int right) {
        if (isNullOrEmpty(buttonList.size())) {
            return;
        }
        if (left >= right) {
            return;
        }
        int middle = left + (right - left) / 2;
        int pivot = getInt(buttonList.get(middle));
        int i = left, j = right;
        while (i <= j) {
            if (!SortScreen.sorted) {
                while (getInt(buttonList.get(i)) < pivot) {
                    i++;
                }
                while (getInt(buttonList.get(j)) > pivot) {
                    j--;
                }
            } else {
                while (getInt(buttonList.get(i)) > pivot) {
                    i++;
                }
                while (getInt(buttonList.get(j)) < pivot) {
                    j--;
                }
            }
            if (i <= j) {
                JButton temp = buttonList.get(i);
                buttonList.set(i, buttonList.get(j));
                buttonList.set(j, temp);
                i++;
                j--;
                refreshSortPage(buttonList, panel);
            }
        }
        if (left < j) {
            quickSortDescending(buttonList, left, j);
        }
        if (right > i) {
            quickSortDescending(buttonList, i, right);
        }
    }

Java
1
2
3
4
5
6
7
8
9
10
11
12
   @Override
    public void run() {
 
   // sorted = boolean = false
        if ( !SortScreen.sorted  ) {
            quickSortDescending(jButtonList, 0, jButtonList.size() - 1);
            SortScreen.sorted = true;
        } else {
            quickSortIncreasing(jButtonList, 0, jButtonList.size() - 1);
            SortScreen.sorted = false;
        }
    }

Задание спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2020, 01:33
Ответы с готовыми решениями:

Проблема с сортировкой (BXReady)
Добрый день. Ковыряюсь уже несколько дней, не могу понять в какую сторону уже копать. Не понятно с какой логикой сортируется товар. Для...

Проблема с сортировкой строк
Вот собственно кусок кода, необходимо отсортировать значения строк в классе. Проблема в том что процесс сортировки не происходит до конца....

Проблема с сортировкой в Excel
:( Я уже поднимал тему на счет того, что если вводить в Excel строку '123e7', то оно заменяет его на 1230000000, формат соответственно...

7
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
28.11.2020, 02:31
Примерно так:
Java
1
2
3
final var comparator = Comparator.comparingInt(button -> getInt(button));
buttonList.sort(comparator);
buttonList.sort(comparator.reversed());
т. е. запили компаратор и передавай как параметр в свою функцию сортировки, сравнивай значения списка компаратором comparator.compare => профит.

P. S. https://www.baeldung.com/java-... -comparing
1
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 23
28.11.2020, 16:42  [ТС]
Спасибо за совет. Очень полезно. Но специфика моего задания требует быстро отсортировать большой массив данных. А по умолчанию sort у компаратора использует сортировку слиянием.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
28.11.2020, 16:47
Цитата Сообщение от evil_tourist Посмотреть сообщение
А по умолчанию sort у компаратора использует сортировку слиянием.
https://docs.oracle.com/javase... omparator-
Implementation Note:
This implementation is a stable, adaptive, iterative mergesort that requires far fewer than n lg(n) comparisons when the input array is partially sorted, while offering the performance of a traditional mergesort when the input array is randomly ordered. If the input array is nearly sorted, the implementation requires approximately n comparisons. Temporary storage requirements vary from a small constant for nearly sorted input arrays to n/2 object references for randomly ordered input arrays.

The implementation takes equal advantage of ascending and descending order in its input array, and can take advantage of ascending and descending order in different parts of the same input array. It is well-suited to merging two or more sorted arrays: simply concatenate the arrays and sort the resulting array.

The implementation was adapted from Tim Peters's list sort for Python ( TimSort). It uses techniques from Peter McIlroy's "Optimistic Sorting and Information Theoretic Complexity", in Proceedings of the Fourth Annual ACM-SIAM Symposium on Discrete Algorithms, pp 467-474, January 1993.
Чта?
0
0 / 0 / 0
Регистрация: 19.05.2018
Сообщений: 23
28.11.2020, 17:03  [ТС]
=) В очередной раз убедился что мне всегда нужно читать документацию
0
28.11.2020, 17:06

Не по теме:

evil_tourist, честно говоря, я сам был приятно удивлен. Всегда думал, что qsort под капотом.

0
29.11.2020, 11:35

Не по теме:

Arsegg, qsort не всегда быстрая или удовлетворяет тем или иным условиям вот и приходится несколько напрягаться.

0
29.11.2020, 15:40

Не по теме:

vvm28, оно понятно, O(N^2) в худшем случае далеко не шутки. Опять же random.shuffle фиксит это. Дополнительной памяти для Array(List)'ов не требует.
Timsort на почти отсортированных данных ~n сравнений. Но опять же n/2 памяти требует.
В любом случае надо смотреть на сами данные, которые нужно отсортировать и на задачу. Bucket-sort вообще за O(N) работает (в лучшем случае), в худшем случае (ссылка на вики):

В некоторых таких случаях для строк, возникающих в реализациях основанного на сортировке строк алгоритма сжатия BWT, оказывается, что быстрая сортировка строк в версии Седжвика значительно превосходит блочную сортировку скоростью.
Универсальной панацеи тут нет.
P. S. Можно было бы еще осветить тему про стабильность данных сортировок, но мне лень :).

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.11.2020, 15:40
Помогаю со студенческими работами здесь

Проблема с сортировкой строк
Здравствуйте. Не сортируется вектор строкового типа. Вот код: #include &lt;iostream&gt; #include &lt;algorithm&gt; ...

Проблема со случайной сортировкой
Всем привет. Столкнулся с непонятной для меня проблемой. Есть запрос: SELECT * FROM a WHERE akey = (SELECT bkey FROM b ORDER BY...

Builder + MySql проблема с сортировкой
Доброе время суток всем Только начинаю постигать азы &quot;Мускула&quot;. У меня билдер 6.0 и &quot;мускул 5.0&quot;. Возникла проблема с...

Проблема с сортировкой CheckBox в DataGridView
Дорогие гуру, у меня такая проблема: Есть DataGridView, в нем одна из колонок типа CheckBox. Заполняю весь грид, включая данные чекбоксы,...

Проблема с сортировкой ассоциативного массива
Добрый день, друзья! Есть некоторый сформированный ассоциативный массив $team_print. Хочу отсортировать его по полю ‘ chas_itogo ’....


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru