Сортировка по возрастанию или убыванию внутри пузырьковой сортировки

StackOverflow https://stackoverflow.com/questions/1856150

Вопрос

После на это был дан ответ Я продолжал работать над кодом.Это работает идеально следующим образом:

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) для выполнения сравнения, чтобы обеспечить максимально гибкий поиск.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top