Сортировка по возрастанию или по убыванию внутри пузырьковой сортировки - PullRequest
0 голосов
/ 06 декабря 2009

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

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 внутри этой функции. Что мне нужно, так это дополнительно вернуть отсортированный нисходящий или восходящий массив (в зависимости от того, будет ли asc == 1 (asc) или asc == 0 (desc)).

Я в недоумении, как реализовать это внутри этого. Я имею в виду, что в настоящее время я могу отсортировать его по возрастанию или по убыванию, но однажды ПОСЛЕ того, как этот метод был вызван с некоторыми неприятными циклами for () и if ().

Я бы хотел, чтобы он был компактным внутри, и в зависимости от того, задаю ли я пузырьковую сортировку (x, 0,0) или (x, 0,1), список должен возвращаться по убыванию или по возрастанию.

Ответы [ 5 ]

2 голосов
/ 06 декабря 2009

Простое решение: Можете ли вы сделать asc в один из 1 или -1?

Тогда вам нужно всего лишь изменить одну строку:

if(asc * customerdata[i][sortafter].compareTo(customerdata[i+1][sortafter]) < 0)
1 голос
/ 06 декабря 2009

И если вы хотите получить ответ типа «разработка программного обеспечения» вместо ответа на быстрый взлом, который я дал выше, вы можете передать функтор (поиск класса Comparator) для сравнения, чтобы обеспечить максимально гибкий поиск. *

1 голос
/ 06 декабря 2009

Сортировка по возрастанию означает, что элемент в 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){

, если вы хотите изменить порядок сортировки.

1 голос
/ 06 декабря 2009

попробуйте это:

 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; ^)

(обратите внимание, что я изменил 2 позиции: "+ asc" и "- asc")

EDIT: Не забудьте поставить большой assert в первой строке, убедившись, что Asc действительно не может быть ничем иным, кроме 0 или 1; ^)

1 голос
/ 06 декабря 2009

Вы всегда можете отсортировать по возрастанию и просто перевернуть его, если требуется убывание. Вопрос в том, является ли повторение теста «если» внутри цикла менее эффективным, чем другой обход массива.

Я предполагаю, что размер массива относительно мал. Пузырьковая сортировка общеизвестно неэффективна и не должна использоваться, за исключением небольших массивов.

...