Сортировка по возрастанию или убыванию внутри пузырьковой сортировки
-
13-09-2019 - |
Вопрос
После на это был дан ответ Я продолжал работать над кодом.Это работает идеально следующим образом:
static String[][] bubbleSort(String customerdata[][], int sortafter, int asc)
{
String temp [];
boolean sort;
do{
sortiert = true;
for (int i = 0 ; i < customerdata.length - 1; i++){
if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0){
temp = customerdata[i];
customerdata[i] = customerdata[i+1];
customerdata[i+1] = temp;
sort = false;
}
}
}while(!sort);
return customerdata;
}
Но, как видите, внутри этой функции мне не хватает int asc.Я хочу дополнительно вернуть отсортированный массив по убыванию или возрастанию (в зависимости от того, по возрастанию == 1 (по возрастанию) или по возрастанию == 0 (по убыванию)).
Я не знаю, как реализовать это внутри этого.Я имею в виду, что в настоящее время я могу сортировать его по возрастанию или убыванию, но однажды ПОСЛЕ того, как этот метод был вызван с некоторыми неприятными длинными циклами for() и if().
Я бы хотел, чтобы он был компактным внутри, и в зависимости от того, даю ли я bubblesort(x,0,0) или (x,0,1), список должен возвращаться по убыванию или возрастанию.
Решение
Сортировка по возрастанию означает, что элемент находится в i
меньше элемента в i + 1
.Сортировка по убыванию означает, что элемент в i
больше, чем элемент в i +
.Хитрость заключается в том, чтобы перевернуть логику, при которой вы решаете, являются ли элементы неуместными.В частности, эта строка:
if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0){
следует изменить на
if(customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) > 0){
если вы хотите изменить порядок сортировки.
Другие советы
Простое решение:Ты можешь сделать asc
в один из 1
или -1
?
Тогда вам нужно будет изменить только одну строку:
if(asc * customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0)
Вы всегда можете выполнить сортировку по возрастанию и просто перевернуть ее, если требуется убыль.Вопрос в том, является ли повторение проверки «if» внутри цикла менее эффективным, чем еще один обход массива.
Я предполагаю, что размер массива относительно невелик.Пузырьковая сортировка заведомо неэффективна и ее не следует использовать, за исключением небольших массивов.
попробуй это:
for (int i = 0 ; i < customerdata.length - 1; i++){
if(customerdata[i+asc][sortafter].compareTo(customerdata[i+1-asc][sortafter]) < 0){
temp = customerdata[i];
customerdata[i] = customerdata[i+1];
customerdata[i+1] = temp;
sort = false;
}
}
Asc может быть 0 или 1 (по возрастанию или убыванию...)
добавляя его в свой индекс, вы по сути меняете оператор if, не добавляя еще один if ;^)
(обратите внимание, что я изменил две позиции:«+ по возрастанию» и «- по возрастанию»)
РЕДАКТИРОВАТЬ:Не забудьте поставить большое утверждение в первой строке, убедившись, что Asc действительно не может быть ничем иным, как 0 или 1 ;^)
И если вам нужен ответ типа «программная инженерия» вместо быстрого ответа, который я дал выше, вы можете передать функтор (поиск класса Comparator) для выполнения сравнения, чтобы обеспечить максимально гибкий поиск.