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

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

28.11.2020, 01:33. Показов 1499. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый 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? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru