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

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

28.11.2020, 01:33. Показов 1513. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru