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

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

28.11.2020, 01:33. Показов 1507. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 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 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru